{
  "format": "lemonergy/studio-file@1",
  "graph": {
    "format": "battery-design/equation-graph@1",
    "checksum": "fnv1a32:320835dd",
    "graph": {
      "analysisModules": [],
      "catalogVersion": "2026.09.3",
      "connections": [
        {
          "from": "normal-0",
          "id": "normal-0--friction-0-0",
          "to": "friction-0",
          "toPort": 0
        },
        {
          "from": "normal-135",
          "id": "normal-135--friction-135-0",
          "to": "friction-135",
          "toPort": 0
        },
        {
          "from": "normal-180",
          "id": "normal-180--friction-180-0",
          "to": "friction-180",
          "toPort": 0
        },
        {
          "from": "normal-45",
          "id": "normal-45--friction-45-0",
          "to": "friction-45",
          "toPort": 0
        },
        {
          "from": "normal-90",
          "id": "normal-90--friction-90-0",
          "to": "friction-90",
          "toPort": 0
        },
        {
          "from": "friction-0",
          "id": "friction-0--margin-0-0",
          "to": "margin-0",
          "toPort": 0
        },
        {
          "from": "slope-0",
          "id": "slope-0--margin-0-1",
          "to": "margin-0",
          "toPort": 1
        },
        {
          "from": "friction-135",
          "id": "friction-135--margin-135-0",
          "to": "margin-135",
          "toPort": 0
        },
        {
          "from": "slope-135",
          "id": "slope-135--margin-135-1",
          "to": "margin-135",
          "toPort": 1
        },
        {
          "from": "friction-180",
          "id": "friction-180--margin-180-0",
          "to": "margin-180",
          "toPort": 0
        },
        {
          "from": "slope-180",
          "id": "slope-180--margin-180-1",
          "to": "margin-180",
          "toPort": 1
        },
        {
          "from": "friction-45",
          "id": "friction-45--margin-45-0",
          "to": "margin-45",
          "toPort": 0
        },
        {
          "from": "slope-45",
          "id": "slope-45--margin-45-1",
          "to": "margin-45",
          "toPort": 1
        },
        {
          "from": "friction-90",
          "id": "friction-90--margin-90-0",
          "to": "margin-90",
          "toPort": 0
        },
        {
          "from": "slope-90",
          "id": "slope-90--margin-90-1",
          "to": "margin-90",
          "toPort": 1
        },
        {
          "from": "cos-0",
          "id": "cos-0--normal-0-0",
          "to": "normal-0",
          "toPort": 0
        },
        {
          "from": "suction-ratio",
          "id": "suction-ratio--normal-0-1",
          "to": "normal-0",
          "toPort": 1
        },
        {
          "from": "cos-135",
          "id": "cos-135--normal-135-0",
          "to": "normal-135",
          "toPort": 0
        },
        {
          "from": "suction-ratio",
          "id": "suction-ratio--normal-135-1",
          "to": "normal-135",
          "toPort": 1
        },
        {
          "from": "cos-180",
          "id": "cos-180--normal-180-0",
          "to": "normal-180",
          "toPort": 0
        },
        {
          "from": "suction-ratio",
          "id": "suction-ratio--normal-180-1",
          "to": "normal-180",
          "toPort": 1
        },
        {
          "from": "cos-45",
          "id": "cos-45--normal-45-0",
          "to": "normal-45",
          "toPort": 0
        },
        {
          "from": "suction-ratio",
          "id": "suction-ratio--normal-45-1",
          "to": "normal-45",
          "toPort": 1
        },
        {
          "from": "cos-90",
          "id": "cos-90--normal-90-0",
          "to": "normal-90",
          "toPort": 0
        },
        {
          "from": "suction-ratio",
          "id": "suction-ratio--normal-90-1",
          "to": "normal-90",
          "toPort": 1
        },
        {
          "from": "sweep-coordinate",
          "id": "sweep-coordinate--suction-ratio-0",
          "to": "suction-ratio",
          "toPort": 0
        },
        {
          "from": "sweep-rate",
          "id": "sweep-rate--sweep-coordinate-0",
          "to": "sweep-coordinate",
          "toPort": 0
        }
      ],
      "evidence": {
        "limitations": [
          "μ = 1.5 is an authored sensitivity value, not a Tesla tyre measurement. Results show conditional feasibility only.",
          "Both normal reaction > 0 and traction reserve ≥ 0 are required. Negative values are retained to expose infeasible regions; no tyre force acts in free flight.",
          "The model is normalised by weight. It does not predict newtons, fan power, battery SOC or a manoeuvre until the corresponding sourced inputs and dynamics are connected.",
          "No fan pressure/flow map or suction transient is assumed. The independent check verifies the implemented equations, not experimental vehicle accuracy."
        ],
        "scope": "A quasi-static parameter sweep, not a driving trajectory. The solver clock 0–1 s is only a sweep coordinate u. Angles are measured from the floor through the wall to the ceiling. No jets, aerodynamic force, acceleration, curvature, tyre load sensitivity or vehicle-specific mass is included.",
        "source": {
          "title": "OpenStax University Physics: friction and normal reaction",
          "url": "https://openstax.org/books/university-physics-volume-1/pages/6-2-friction"
        },
        "studySetting": {
          "mu": 1.5
        }
      },
      "history": [
        {
          "action": "created",
          "actorId": "local-user",
          "actorKind": "human",
          "at": "2026-10-17T08:00:00Z",
          "reason": "Dimensionless static contact sensitivity; no Roadster property estimates."
        }
      ],
      "id": "contact-mu-1p5",
      "market": "road",
      "mode": "manual",
      "nodes": [
        {
          "id": "cos-0",
          "name": "0° · cos θ",
          "outputQuantity": "dimensionless",
          "parameters": {
            "value": 1
          },
          "position": {
            "x": 30,
            "y": 220
          },
          "type": "constant"
        },
        {
          "id": "cos-135",
          "name": "135° · cos θ",
          "outputQuantity": "dimensionless",
          "parameters": {
            "value": -0.7071067811865475
          },
          "position": {
            "x": 30,
            "y": 850
          },
          "type": "constant"
        },
        {
          "id": "cos-180",
          "name": "180° · cos θ",
          "outputQuantity": "dimensionless",
          "parameters": {
            "value": -1
          },
          "position": {
            "x": 30,
            "y": 1060
          },
          "type": "constant"
        },
        {
          "id": "cos-45",
          "name": "45° · cos θ",
          "outputQuantity": "dimensionless",
          "parameters": {
            "value": 0.7071067811865476
          },
          "position": {
            "x": 30,
            "y": 430
          },
          "type": "constant"
        },
        {
          "id": "cos-90",
          "name": "90° · cos θ",
          "outputQuantity": "dimensionless",
          "parameters": {
            "value": 0
          },
          "position": {
            "x": 30,
            "y": 640
          },
          "type": "constant"
        },
        {
          "id": "friction-0",
          "name": "0° · μ N / mg",
          "outputQuantity": "dimensionless",
          "parameters": {
            "gain": 1.5,
            "inputQuantity": "dimensionless"
          },
          "position": {
            "x": 550,
            "y": 220
          },
          "type": "gain"
        },
        {
          "id": "friction-135",
          "name": "135° · μ N / mg",
          "outputQuantity": "dimensionless",
          "parameters": {
            "gain": 1.5,
            "inputQuantity": "dimensionless"
          },
          "position": {
            "x": 550,
            "y": 850
          },
          "type": "gain"
        },
        {
          "id": "friction-180",
          "name": "180° · μ N / mg",
          "outputQuantity": "dimensionless",
          "parameters": {
            "gain": 1.5,
            "inputQuantity": "dimensionless"
          },
          "position": {
            "x": 550,
            "y": 1060
          },
          "type": "gain"
        },
        {
          "id": "friction-45",
          "name": "45° · μ N / mg",
          "outputQuantity": "dimensionless",
          "parameters": {
            "gain": 1.5,
            "inputQuantity": "dimensionless"
          },
          "position": {
            "x": 550,
            "y": 430
          },
          "type": "gain"
        },
        {
          "id": "friction-90",
          "name": "90° · μ N / mg",
          "outputQuantity": "dimensionless",
          "parameters": {
            "gain": 1.5,
            "inputQuantity": "dimensionless"
          },
          "position": {
            "x": 550,
            "y": 640
          },
          "type": "gain"
        },
        {
          "id": "margin-0",
          "name": "0° · traction reserve / mg",
          "outputQuantity": "dimensionless",
          "parameters": {
            "inputs": 2
          },
          "position": {
            "x": 810,
            "y": 220
          },
          "type": "sum"
        },
        {
          "id": "margin-135",
          "name": "135° · traction reserve / mg",
          "outputQuantity": "dimensionless",
          "parameters": {
            "inputs": 2
          },
          "position": {
            "x": 810,
            "y": 850
          },
          "type": "sum"
        },
        {
          "id": "margin-180",
          "name": "180° · traction reserve / mg",
          "outputQuantity": "dimensionless",
          "parameters": {
            "inputs": 2
          },
          "position": {
            "x": 810,
            "y": 1060
          },
          "type": "sum"
        },
        {
          "id": "margin-45",
          "name": "45° · traction reserve / mg",
          "outputQuantity": "dimensionless",
          "parameters": {
            "inputs": 2
          },
          "position": {
            "x": 810,
            "y": 430
          },
          "type": "sum"
        },
        {
          "id": "margin-90",
          "name": "90° · traction reserve / mg",
          "outputQuantity": "dimensionless",
          "parameters": {
            "inputs": 2
          },
          "position": {
            "x": 810,
            "y": 640
          },
          "type": "sum"
        },
        {
          "id": "normal-0",
          "name": "0° · N / mg",
          "outputQuantity": "dimensionless",
          "parameters": {
            "inputs": 2
          },
          "position": {
            "x": 290,
            "y": 220
          },
          "type": "sum"
        },
        {
          "id": "normal-135",
          "name": "135° · N / mg",
          "outputQuantity": "dimensionless",
          "parameters": {
            "inputs": 2
          },
          "position": {
            "x": 290,
            "y": 850
          },
          "type": "sum"
        },
        {
          "id": "normal-180",
          "name": "180° · N / mg",
          "outputQuantity": "dimensionless",
          "parameters": {
            "inputs": 2
          },
          "position": {
            "x": 290,
            "y": 1060
          },
          "type": "sum"
        },
        {
          "id": "normal-45",
          "name": "45° · N / mg",
          "outputQuantity": "dimensionless",
          "parameters": {
            "inputs": 2
          },
          "position": {
            "x": 290,
            "y": 430
          },
          "type": "sum"
        },
        {
          "id": "normal-90",
          "name": "90° · N / mg",
          "outputQuantity": "dimensionless",
          "parameters": {
            "inputs": 2
          },
          "position": {
            "x": 290,
            "y": 640
          },
          "type": "sum"
        },
        {
          "id": "slope-0",
          "name": "0° · −|sin θ|",
          "outputQuantity": "dimensionless",
          "parameters": {
            "value": 0
          },
          "position": {
            "x": 550,
            "y": 320
          },
          "type": "constant"
        },
        {
          "id": "slope-135",
          "name": "135° · −|sin θ|",
          "outputQuantity": "dimensionless",
          "parameters": {
            "value": -0.7071067811865476
          },
          "position": {
            "x": 550,
            "y": 950
          },
          "type": "constant"
        },
        {
          "id": "slope-180",
          "name": "180° · −|sin θ|",
          "outputQuantity": "dimensionless",
          "parameters": {
            "value": 0
          },
          "position": {
            "x": 550,
            "y": 1160
          },
          "type": "constant"
        },
        {
          "id": "slope-45",
          "name": "45° · −|sin θ|",
          "outputQuantity": "dimensionless",
          "parameters": {
            "value": -0.7071067811865475
          },
          "position": {
            "x": 550,
            "y": 530
          },
          "type": "constant"
        },
        {
          "id": "slope-90",
          "name": "90° · −|sin θ|",
          "outputQuantity": "dimensionless",
          "parameters": {
            "value": -1
          },
          "position": {
            "x": 550,
            "y": 740
          },
          "type": "constant"
        },
        {
          "id": "suction-ratio",
          "name": "λ = suction / weight · 0 to 2",
          "outputQuantity": "dimensionless",
          "parameters": {
            "gain": 2,
            "inputQuantity": "fraction"
          },
          "position": {
            "x": 550,
            "y": 20
          },
          "type": "gain"
        },
        {
          "id": "sweep-coordinate",
          "name": "Parameter coordinate u · 0 to 1",
          "outputQuantity": "fraction",
          "parameters": {
            "gain": 1,
            "initial": 0,
            "rateQuantity": "fraction-per-second"
          },
          "position": {
            "x": 290,
            "y": 20
          },
          "type": "integrator"
        },
        {
          "id": "sweep-rate",
          "name": "Sweep rate · 1/s",
          "outputQuantity": "fraction-per-second",
          "parameters": {
            "value": 1
          },
          "position": {
            "x": 30,
            "y": 20
          },
          "type": "constant"
        }
      ],
      "probes": [
        {
          "blockId": "margin-0"
        },
        {
          "blockId": "margin-135"
        },
        {
          "blockId": "margin-180"
        },
        {
          "blockId": "margin-45"
        },
        {
          "blockId": "margin-90"
        },
        {
          "blockId": "normal-0"
        },
        {
          "blockId": "normal-135"
        },
        {
          "blockId": "normal-180"
        },
        {
          "blockId": "normal-45"
        },
        {
          "blockId": "normal-90"
        },
        {
          "blockId": "suction-ratio"
        }
      ],
      "schema": "battery-design/equation-graph@1",
      "segment": null,
      "settings": {
        "absoluteTolerance": 1e-12,
        "algebraicMaxIterations": 30,
        "algebraicTolerance": 1e-10,
        "endS": 1,
        "implicitMaxIterations": 20,
        "implicitTolerance": 1e-10,
        "initialStepS": 0.001,
        "maxStepS": 0.01,
        "maxSteps": 10000,
        "method": "dormand-prince-45",
        "minStepS": 1e-12,
        "relativeTolerance": 1e-9,
        "startS": 0
      },
      "title": "Contact envelope: μ = 1.5 sensitivity case",
      "validationCase": {
        "id": "contact-mu-1p5",
        "version": 1
      },
      "version": "1.0.0"
    }
  }
}
