schema_version: 1
kind: assembly
name: disc-brake
intent: >-
  Rebuild of the COMSOL 6.3 Application Library model "Heat Generation in a Disc Brake" (sources/comsol-brake-disc-packet.md
  is authoritative; figures 1, 2, 3 and 5 are illustrative) as a machine of two separately designed parts in COMSOL's
  coordinates converted to millimetres: the half-thickness disc (radius 140, z = 0..13, symmetry plane z = 0) with its
  radius-80 hub (z = 13..23), rotating about z on a revolute joint driven by the car's panic-braking speed history through
  the wheel radius, and one pad, the fixed datum, resting on the disc face z = 13. A transient CalculiX thermal analysis
  (friction_brake source) and the reduced brake_energy budget predict how hot the disc and pad get while an 1,800 kg car
  brakes from 25 m/s to 5 m/s at 10 m/s2 between t = 2 s and 4 s, and how much they cool by t = 12 s.
units: {length: mm, angle: deg}
frame:
  origin: COMSOL origin in mm, on the disc axis in the disc symmetry plane (the pad's own frame; the pad is the datum part)
  axes:
    x: "COMSOL x, in the symmetry plane; the pad's trailing (downstream) edge lies toward -x"
    y: "COMSOL y, from the disc axis through the pad centreline (pad at y = 88..135)"
    z: "disc rotation axis, from the symmetry plane toward the pad and the hub"
  datums:
    - {name: A, description: disc symmetry plane z = 0 (the half-disc bottom face)}
    - {name: B, description: disc rotation axis x = y = 0}
    - {name: C, description: disc rubbing face and pad seat z = 13}
    - {name: D, description: pad mirror plane x = 0}
envelope: {min: [-140.0, -140.0, 0.0], max: [140.0, 140.0, 23.0], tolerance: 0.1}
datum_part: pad
parts:
  - name: disc
    kind: modelled
    design: disc-brake-disc
    intent: >-
      Half-thickness brake disc with its hub, one solid, in its own frame: rotation axis +z through the origin, symmetry
      face on z = 0; at rest this frame coincides with the assembly (COMSOL, mm) frame. Packet construction steps 1-2:
      disc cylinder radius 140, z = 0..13, fused with the coaxial hub cylinder radius 80, z = 13..23. Faces it provides:
      the symmetry face z = 0 (full radius-140 disc, the half-model cut plane); the rubbing face z = 13, the annulus
      r = 80..140 on which the pad rests (the pad footprint covers r = 90.0..135.2 at 69..111 deg from +x); the outer rim
      cylinder r = 140 (z = 0..13); the hub side cylinder r = 80 (z = 13..23); the hub top z = 23. No bore, bolt holes,
      vents, chamfers or fillets (the reference model has none). Volume pi (140^2 x 13 + 80^2 x 10) = 1,001,540 mm3;
      bounding box [-140, -140, 0]..[140, 140, 23]; centroid (0, 0, 8.809).
    material: disc material of packet Table 1 (iron-like; k 82 W/(m K), Cp 449 J/(kg K), emissivity 0.28)
    density_kg_m3: 7870.0
  - name: pad
    kind: modelled
    design: disc-brake-pad
    intent: >-
      Brake pad, one solid, in its own frame, which is the assembly frame (COMSOL coordinates in mm; the pad is the fixed
      datum). Packet construction steps 3-4: a closed outline in the plane z = 13 extruded +z by 6.5 to z = 19.5. The
      outline is four cubic Bezier curves, control points (x, y) in order: B1 (0, 135), (20, 135), (50, 130), (40, 105),
      rational with weight 2.5 on (50, 130); B2 (40, 105), (30, 80), (35, 90), (0, 90); B3 (0, 90), (-35, 90), (-30, 80),
      (-40, 105); B4 (-40, 105), (-50, 130), (-20, 135), (0, 135), rational with weight 2.5 on (-50, 130); every other
      weight 1. The outline is mirror-symmetric about x = 0: x = -44.69..44.69, y = 88.03..135.00, r = 90.00..135.23
      from the z axis, area 3,544.4 mm2, centroid (0, 111.91). Faces it provides: the contact face z = 13 resting on the
      disc rubbing face; the top face z = 19.5; the outer side wall (B1, B4) and the inner side wall (B2, B3), both
      parallel to z. No backing plate, chamfers or fillets. Volume 23,038.5 mm3; bounding box
      [-44.69, 88.03, 13]..[44.69, 135.00, 19.5].
    material: pad friction material of packet Table 1 (k 8.7 W/(m K), Cp 935 J/(kg K), emissivity 0.8)
    density_kg_m3: 2000.0
parameters:
  - {name: padSeatZ, value: 13.0, unit: mm, provenance: stated, tolerance: 0.01, source: "sources/comsol-brake-disc-packet.md, Geometry construction steps 1-3", description: height of the disc rubbing face where the pad contact face rests}
joints:
  - name: discSpin
    kind: revolute
    parent: pad
    child: disc
    parent_frame: {origin: [0.0, 0.0, 0.0], axis: [0.0, 0.0, 1.0]}
    child_frame: {origin: [0.0, 0.0, 0.0], axis: [0.0, 0.0, 1.0]}
    offset: 0.0
    drive:
      kind: motor
      history: [[0.0, 795.77], [2.0, 795.77], [4.0, 159.15], [12.0, 159.15]]
      description: >-
        disc speed = vehicle speed / wheelRadius (0.30 m, inferred): 25 m/s = 795.77 rpm to t = 2 s, linear to
        5 m/s = 159.15 rpm at t = 4 s, constant to t = 12 s; positive is counter-clockwise about +z, as COMSOL's
        u_trans = (-y, x) v / r_wheel; the packet's 0.2 s C2 smoothing of the two corners is not represented
    description: >-
      the disc turns about the COMSOL z axis under the fixed pad; the pad has no material on that axis (its outline
      spans r = 90.0..135.2), so the pad-side frame lies on the axis 88.025 mm outside the pad's bounding box
boundaries:
  - name: discContact
    role: contact
    body: disc
    select: plane
    point: [0.0, 111.9, 13.0]
    normal: [0.0, 0.0, 1.0]
    area: {expected: 41469.0, tolerance_rel: 0.01, provenance: derived, note: "pi (140^2 - 80^2), the whole rubbing annulus; the pad covers 3,544.4 mm2 of it and sweeps r = 90.0..135.2"}
    description: disc rubbing face z = 13 under the pad (disc side of COMSOL boundary 11, thermal contact with friction heat)
  - name: padContact
    role: contact
    body: pad
    select: plane
    point: [0.0, 111.9, 13.0]
    normal: [0.0, 0.0, -1.0]
    area: {expected: 3544.4, tolerance_rel: 0.01, provenance: derived, note: area enclosed by the four Bezier curves}
    description: pad face z = 13 resting on the disc (pad side of COMSOL boundary 11)
  - name: discSymmetry
    role: symmetry
    body: disc
    select: plane
    point: [0.0, 0.0, 0.0]
    normal: [0.0, 0.0, -1.0]
    area: {expected: 61575.2, tolerance_rel: 0.01, provenance: derived, note: pi 140^2}
    description: half-model cut plane z = 0 (COMSOL boundary 3), insulated
  - {name: discFree, role: convection, body: disc, select: rest, description: "rim r = 140, hub side r = 80 and hub top z = 23: forced convection to T_air plus surface-to-ambient radiation, emissivity 0.28"}
  - {name: padFree, role: convection, body: pad, select: rest, description: "pad top z = 19.5 and side walls: forced convection to T_air plus surface-to-ambient radiation, emissivity 0.8"}
operating_cases:
  - id: panicBrake
    values: {initialSpeed: 25.0, finalSpeed: 5.0, deceleration: 10.0, brakeStart: 2.0, brakeEnd: 4.0, endTime: 12.0}
    units: {initialSpeed: m/s, finalSpeed: m/s, deceleration: m/s2, brakeStart: s, brakeEnd: s, endTime: s}
    source: "sources/comsol-brake-disc-packet.md, Scenario, Global parameters and Physics settings (velocity v(t))"
    description: 1,800 kg car at 25 m/s panic-brakes at 10 m/s2 from t = 2 s to 4 s, then rolls on at 5 m/s without braking to t = 12 s
observables:
  - {id: peakDiscTemperature, quantity: max_temperature, unit: K, simulation: brakeThermal, case: panicBrake, body: disc, averaging: maximum, max: 600.0, description: "highest disc temperature anywhere over t = 0..12 s; the packet states braking power starts to fade above 600 K"}
  - id: lineMaxTemperature
    quantity: line_max_temperature
    unit: K
    simulation: brakeThermal
    case: panicBrake
    body: disc
    line: [[0.0, 0.0, 12.9], [-47.0, 131.6, 12.9]]
    averaging: maximum
    description: highest temperature over t = 0..12 s along the packet's radial probe line (figure 5), 0.1 mm under the rubbing face, from the axis to the rim along the pad's trailing edge
  - {id: timeOfPeak, quantity: time_of_max_temperature, unit: s, simulation: brakeThermal, case: panicBrake, body: disc, averaging: maximum, description: time at which the disc reaches peakDiscTemperature}
  - {id: producedHeat, quantity: produced_heat, unit: J, simulation: brakeThermal, case: panicBrake, averaging: integral, description: "W_prod, the frictional heat rate at the disc/pad contact integrated over t = 0..12 s"}
  - {id: dissipatedHeat, quantity: dissipated_heat, unit: J, simulation: brakeThermal, case: panicBrake, averaging: integral, description: "W_diss, the convective plus radiative heat rate over all external surfaces integrated over t = 0..12 s"}
  - {id: hotspotRadius, quantity: hotspot_radius, unit: mm, simulation: brakeThermal, case: panicBrake, body: disc, averaging: maximum, description: distance from the disc axis of the hottest point of the disc surface}
  - {id: peakPadTemperature, quantity: max_temperature, unit: K, simulation: brakeThermal, case: panicBrake, body: pad, averaging: maximum, description: "highest pad temperature over t = 0..12 s (the packet asks how hot the pads get)"}
  - {id: budgetPeakTemperature, quantity: max_temperature, unit: K, simulation: brakeEnergy, case: panicBrake, body: disc, averaging: maximum, description: "reduced-budget disc surface maximum (ring-averaged rise plus the flash rise under the pad), a cross-check of peakDiscTemperature"}
  - {id: budgetProducedHeat, quantity: produced_heat, unit: J, simulation: brakeEnergy, case: panicBrake, averaging: integral, description: reduced-budget friction heat over t = 0..12 s}
  - {id: budgetStoredHeat, quantity: stored_heat, unit: J, simulation: brakeEnergy, case: panicBrake, averaging: final, description: reduced-budget heat stored in the disc and pad at t = 12 s}
  - {id: budgetDissipatedHeat, quantity: dissipated_heat, unit: J, simulation: brakeEnergy, case: panicBrake, averaging: integral, description: reduced-budget convective plus radiative loss over t = 0..12 s}
simulations:
  - id: brakeThermal
    physics: thermal_transient
    solver: calculix
    cases: [panicBrake]
    bodies: [disc, pad]
    inputs: &brakeInputs
      vehicleMass: {value: 1800.0, unit: kg, provenance: stated, source: "sources/comsol-brake-disc-packet.md, Scenario (m_car)"}
      initialSpeed: {value: 25.0, unit: m/s, provenance: stated, source: "sources/comsol-brake-disc-packet.md, Scenario and Global parameters (v0)"}
      deceleration: {value: 10.0, unit: m/s2, provenance: stated, source: "sources/comsol-brake-disc-packet.md, Scenario (a0 = -10 m/s2)"}
      brakeStart: {value: 2.0, unit: s, provenance: stated, source: "sources/comsol-brake-disc-packet.md, Global parameters (t_brake_start)"}
      brakeEnd: {value: 4.0, unit: s, provenance: stated, source: "sources/comsol-brake-disc-packet.md, Global parameters (t_brake_end)"}
      endTime: {value: 12.0, unit: s, provenance: stated, source: "sources/comsol-brake-disc-packet.md, Physics settings (v(t) to t = 12 s) and study output times"}
      brakeCount: {value: 8.0, unit: "", provenance: stated, source: "sources/comsol-brake-disc-packet.md, Model definition (P_b = P / 8, eight pads)"}
      ambientTemperature:
        value: 300.0
        unit: K
        provenance: inferred
        rationale: >-
          T_air is not stated. The packet's Table 1 air properties (rho 1.170 kg/m3, k 0.026 W/(m K)) are dry air at about
          300 K and 1 atm (ideal gas: 101325 / (1.170 x 287.05) = 302 K), the conventional reference ambient; the standard
          uncertainty covers COMSOL's 293.15 K default
        uncertainty: 5.0
      initialTemperature: {value: 300.0, unit: K, provenance: derived, formula: ambientTemperature, source: "sources/comsol-brake-disc-packet.md, Physics settings (initial values T = T_air)", uncertainty: 5.0}
      disc.density: {value: 7870.0, unit: kg/m3, provenance: stated, source: "sources/comsol-brake-disc-packet.md, Table 1"}
      disc.specificHeat: {value: 449.0, unit: J/(kg K), provenance: stated, source: "sources/comsol-brake-disc-packet.md, Table 1"}
      disc.conductivity: {value: 82.0, unit: W/(m K), provenance: stated, source: "sources/comsol-brake-disc-packet.md, Table 1"}
      disc.emissivity: {value: 0.28, unit: "", provenance: stated, source: "sources/comsol-brake-disc-packet.md, Table 1 and Physics settings"}
      pad.density: {value: 2000.0, unit: kg/m3, provenance: stated, source: "sources/comsol-brake-disc-packet.md, Table 1"}
      pad.specificHeat: {value: 935.0, unit: J/(kg K), provenance: stated, source: "sources/comsol-brake-disc-packet.md, Table 1"}
      pad.conductivity: {value: 8.7, unit: W/(m K), provenance: stated, source: "sources/comsol-brake-disc-packet.md, Table 1"}
      pad.emissivity: {value: 0.8, unit: "", provenance: stated, source: "sources/comsol-brake-disc-packet.md, Table 1 and Physics settings"}
      airDensity: {value: 1.17, unit: kg/m3, provenance: stated, source: "sources/comsol-brake-disc-packet.md, Table 1"}
      airSpecificHeat: {value: 1100.0, unit: J/(kg K), provenance: stated, source: "sources/comsol-brake-disc-packet.md, Table 1"}
      airConductivity: {value: 0.026, unit: W/(m K), provenance: stated, source: "sources/comsol-brake-disc-packet.md, Table 1"}
      airViscosity:
        value: 1.85e-5
        unit: Pa s
        provenance: inferred
        rationale: >-
          Table 1 gives no air viscosity, which the external forced-convection correlation (L = 0.14 m, U = v(t)) needs;
          dry air at 300 K (Sutherland) is 1.85e-5 Pa s; the uncertainty covers 290-310 K
        uncertainty: 5.0e-7
      convectionLength: {value: 0.14, unit: m, provenance: stated, source: "sources/comsol-brake-disc-packet.md, Physics settings (external forced convection, L = 0.14 m, U = v(t))"}
      wheelRadius:
        value: 0.3
        unit: m
        provenance: inferred
        rationale: >-
          r_wheel is not stated; it sets only the disc speed v / r_wheel, not the heat. An 1,800 kg car with a
          280 mm disc runs 15-17 inch wheels whose tyre rolling radius is 0.30-0.32 m; the uncertainty covers 0.25-0.35 m
        uncertainty: 0.05
      frictionCoefficient: {value: 0.3, unit: "", provenance: stated, source: "sources/comsol-brake-disc-packet.md, Model definition (mu, contact pressure p = Q_b / (mu v))"}
      contactMicrohardness: {value: 8.0e8, unit: Pa, provenance: stated, source: "sources/comsol-brake-disc-packet.md, Physics settings (thermal contact, Hc = 800 MPa)"}
    settings: {source: friction_brake, disc: disc, pad: pad, end_time: 12.0, time_step: 0.05, mesh_size_mm: 6.0, contact_mesh_size_mm: 3.0, line_radius_mm: 3.0}
    outputs: [peakDiscTemperature, lineMaxTemperature, timeOfPeak, producedHeat, dissipatedHeat, hotspotRadius, peakPadTemperature]
    refinement: [1.0, 0.7]
    description: >-
      Transient heat conduction in the placed disc and pad from t = 0 to 12 s: friction heat P_b = m v |a| / 8 at the
      contact while braking, split between disc and pad by Charron's effusivity ratio, carried round the rotating disc
      with the moving-source flash rise under the pad; symmetry face insulated; every other face convects (flat plate at
      the vehicle speed) and radiates to T_air. 0.05 s steps match the packet's finest output spacing
  - id: brakeEnergy
    physics: reduced
    solver: reduced:brake_energy
    cases: [panicBrake]
    bodies: [disc, pad]
    inputs: *brakeInputs
    settings: {disc: disc, pad: pad, end_time: 12.0, time_step: 0.05}
    outputs: [budgetPeakTemperature, budgetProducedHeat, budgetStoredHeat, budgetDissipatedHeat]
    description: reduced energy budget of the same braking event (same inputs as brakeThermal), a cross-check of the CalculiX heat balance and peak temperature
acceptance:
  mass_kg: {expected: 7.928, tolerance_rel: 0.01, provenance: derived, note: "disc 1,001,540 mm3 x 7870 kg/m3 = 7.882 kg plus pad 23,038.5 mm3 x 2000 kg/m3 = 0.046 kg"}
  center_of_mass: {expected: [0.0, 0.65, 8.852], tolerance: 0.1, provenance: derived, note: "disc centroid (0, 0, 8.809), pad centroid (0, 111.91, 16.25), mass-weighted"}
  clearances:
    - {name: padSeated, a: pad, b: disc, min_gap: 0.0, max_gap: 0.05, interference_tolerance: 1.0, description: the pad contact face rests on the disc rubbing face z = 13 without cutting into it}
  motions:
    - {name: discRevolution, drive: discSpin, range: [0.0, 360.0], steps: 12, interference_tolerance: 1.0, description: one full disc revolution under the fixed pad; the pad slides on the rubbing face and never interferes}
references:
  - {path: sources/comsol-brake-disc-packet.md, kind: text, role: authoritative, sha256: 85535fc3210d6d0174945725ecf1a1f29351991bc272ba55fc138b0ad254638d, units: m, note: "transcribed COMSOL 6.3 model definition, geometry construction and physics settings; results excluded"}
  - {path: sources/figure-1-geometry.png, kind: image, role: illustrative, sha256: 8c7faad09a9d6663c0a39fe6e18e5e721807c6750bf3b40b7ab67f95a36f5c54, note: "COMSOL figure 1, disc, hub and pad geometry (axes in m)"}
  - {path: sources/figure-2-velocity.png, kind: image, role: illustrative, sha256: 05a0b5ceb2f81378a47ef8ac2b41edbf948dfe3c0c3392cb62b1c0ef8c56ccc1, note: "COMSOL figure 2, smoothed vehicle speed v(t): 25 m/s to 5 m/s between 2 s and 4 s"}
  - {path: sources/figure-3-acceleration.png, kind: image, role: illustrative, sha256: bb3f0ef43eaca917061fb013edd68fece3342aebec4ef0244089d6216d71c2dd, note: "COMSOL figure 3, smoothed acceleration a(t) = -10 m/s2 between 2 s and 4 s"}
  - {path: sources/figure-5-probe-line.png, kind: image, role: illustrative, sha256: f3ffe42b7cc21121f49b80d52056b377c9aa4b90aec2d13ac0fbac1ecba5d0d5, note: "COMSOL figure 5, radial probe line (red) along the pad's trailing edge"}
open_questions:
  - "Ambient and initial temperature T_air is not stated; 300 K is inferred from the Table 1 air properties (u = 5 K)."
  - "Wheel radius r_wheel is not stated; 0.30 m is inferred from a typical tyre rolling radius (u = 0.05 m). It sets the disc speed (drive history 795.77 -> 159.15 rpm) and the flash rise, not the heat input."
  - "Air dynamic viscosity for the forced-convection correlation is not in Table 1; 1.85e-5 Pa s (dry air at 300 K) is inferred."
  - "The disc has one face at z = 13, so discContact is the whole rubbing annulus (41,469 mm2); in COMSOL only the pad footprint (3,544.4 mm2) is in contact and the rest of that face convects and radiates."
  - "COMSOL's thermal contact conductance (Hc = 800 MPa with p = Q_b / (mu v)) also needs surface roughness and asperity slope, which the packet omits; frictionCoefficient and contactMicrohardness are recorded for traceability, and whether the analyses model a finite contact conductance is unverified."
  - "The packet's 0.2 s smoothing of v(t) (continuous second derivative) is not representable in the piecewise-linear drive history; the heat input is unaffected because v still falls from 25 to 5 m/s."
  - "The discSpin pad-side frame (0, 0, 0) is on the disc axis, 88.025 mm outside the pad's contract envelope [-44.694, 88.025, 13]..[44.694, 135, 19.5]; every revolute frame about the disc axis lies outside the off-axis pad, so a cross-check requiring joint origins inside each body's envelope cannot pass while the pad is the fixed datum and the disc rotates about its own axis."
  - "Whether W_prod and W_diss cover the disc only or the disc and the pad is ambiguous in the packet (it says 'of the disc' but integrates over all external surfaces); the total friction heat of one brake is m (v0^2 - v1^2) / 16 = 67,500 J."
release_status: reconstruction
