heatsink_forced_mlp

PINNeAPPle ModelRegistry 'bench_mlp' (4 x 128, SiLU) on log-scaled geometry, material and operating variables, trained on 6000 solves of the HeatSink Sizer physics engine (Teertstra composite parallel-plate model, 3-D finite-volume base conduction, developing-flow pressure drop). Returns the resistance, the pressure drop and a split-conformal 95 % upper bound on the resistance.

heatsink_forced_mlp v1.0.0 (revision v1.0.0.post1) · part of the PINNeAPPle zoo · training data PINNeAPPle-Labs/heatsink-forced-convection

Try it without installing anything: PINNeAPPle zoo demo (pick heatsink_forced_mlp: its predictions along each input with their band and where its physics checks warn or fail, and your own inputs evaluated in the browser).

Task: Plate-fin heat sink in ducted forced convection: base-to-air thermal resistance and pressure drop

Inputs

Name Unit Description
base_width_mm mm base width (across the fins)
base_depth_mm mm base depth = flow length
base_thickness_mm mm base plate thickness
n_fins - number of fins
fin_thickness_mm mm fin thickness
fin_height_mm mm fin height
k_w_mk W/(m K) material thermal conductivity
source_width_mm mm heat-source footprint width
source_depth_mm mm heat-source footprint depth
t_ambient_c degC ambient (inlet) air temperature
air_velocity_m_s m/s approach air velocity
power_w W dissipated power

Outputs

Name Unit Description
r_base_k_w K/W thermal resistance, base to ambient air
pressure_drop_pa Pa air-side pressure drop
r_base_upper95_k_w K/W split-conformal 95 % upper bound on r_base_k_w

Validity range

  • base_width_mm: [30.0, 200.0]
  • base_depth_mm: [30.0, 200.0]
  • base_thickness_mm: [2.0, 15.0]
  • fin_thickness_mm: [0.6, 4.0]
  • fin_height_mm: [8.0, 80.0]
  • k_w_mk: [150.0, 400.0]
  • source_frac_w: [0.15, 1.0]
  • source_frac_d: [0.15, 1.0]
  • t_ambient_c: [0.0, 50.0]
  • fin_gap_mm: [0.6, 12.0]
  • fin_gap_note: gap sampled in 0.8-10 mm, then the fin count is rounded; the realised gaps of the training designs span 0.56-12.2 mm
  • air_velocity_m_s: [0.5, 6.0]
  • power_w: [10.0, 400.0]
  • regime: ducted (no bypass) laminar/developing forced convection in air

Known limitations

  • Ducted flow: real heat sinks with bypass lose 20-50 % of the airflow; correct the velocity first.
  • Convection correlations carry a typical +-15 % accuracy; the surrogate's own error (<1 % mean) is against the engine, not against a measurement.
  • Screening tool: re-verify a chosen design with the physics engine.

Architecture

  • bench_mlp — {"in_dim": 13, "out_dim": 2, "width": 128, "depth": 4, "act": "silu", "targets": ["log R", "log dP"]}

Physics

  • Teertstra, Yovanovich & Culham (2000) composite parallel-plate Nusselt number
  • 3-D finite-volume conduction in the base (spreading resistance)
  • developing-flow friction + entry/exit losses for the pressure drop

Validation

Reference: 900 held-out designs solved by the HeatSink Sizer physics engine (pinneapple_design.thermal.heatsink.engine). The engine is checked against independent methods: Lee et al. spreading (1-5 %), Stephan developing-flow Nu + e-NTU (0-5 %), fully developed friction (2-4 %), FVM grid convergence < 2 %.

Metric Value
test/R_mean_abs_pct 0.7115466916915623
test/R_p95_abs_pct 2.0860917200835067
test/R_max_abs_pct 5.880426003868012
test/dP_mean_abs_pct 1.040685707438438
test/dP_p95_abs_pct 2.6957943093947287
test/dP_max_abs_pct 10.00446805248465
test/R_upper95_coverage_pct 95.77777777777777
test/n 900.0

Trust

Decision: APPROVED · score 1.00 · coverage 100%

Training data

  • dataset: heatsink_forced_convection
  • source: apps/heatsink_sizer/artifacts/{surrogate_forced.pt,dataset_forced.json.gz}

License: apache-2.0

Citation

PINNeAPPle contributors (2026). HeatSink Sizer forced-convection surrogate. PINNeAPPle model zoo, https://github.com/PINNeAPPle-Labs/PINNeAPPle

Physics validation

pass: every applicable check passed (22/22 applicable checks pass; level standard; generated by pp.validate with PINNeAPPle 0.7.0, schema validation-report/v1).

Factor Credibility Meaning
code_verification 0 no evidence
solution_verification 3 passes quantitative checks
validation 4 passes against an independent reference or a guaranteed bound
input_pedigree 4 passes against an independent reference or a guaranteed bound
uncertainty 2 passes with warnings or qualitative evidence only
robustness 0 no evidence
applicability 0 no evidence
Check Status Result
method.status not-applicable no catalog method id given (validate(..., method='S2'))
reference.card_metrics pass card metrics reproduced on the stored reference (max relative difference)
reference.acceptance.test/R_mean_abs_pct pass held-out test/R_mean_abs_pct within the zoo acceptance limit
reference.acceptance.test/R_p95_abs_pct pass held-out test/R_p95_abs_pct within the zoo acceptance limit
reference.acceptance.test/dP_mean_abs_pct pass held-out test/dP_mean_abs_pct within the zoo acceptance limit
physics.model_checks.1 pass monotonic: more airflow never raises the resistance (share of held-out designs violating, +5 % step)
physics.model_checks.2 pass monotonic: a more conductive material never raises the resistance (share of held-out designs violating, +5 % step)
physics.model_checks.3 pass monotonic: a wider heat source spreads less (lower resistance) (share of held-out designs violating, +5 % step)
physics.model_checks.4 pass monotonic: pressure drop grows with air velocity (share of held-out designs violating, +5 % step)
physics.model_checks.5 pass R > 0 and dP > 0 on the held-out designs
applicability.range not-applicable no query inputs given
uncertainty.spread pass the model returns a predictive spread or bound
metamorphic.monotonicity.resistance-falls-with-air-speed pass worst violation 0 over 64 samples
metamorphic.monotonicity.pressure-drop-grows-with-air-speed pass worst violation 0 over 64 samples
metamorphic.monotonicity.resistance-falls-with-conductivity pass worst violation 0 over 64 samples
metamorphic.invariance.resistance-independent-of-power pass worst violation 0.0124 over 64 samples
data.finite pass stored audit card of heatsink_forced_convection: every value finite
data.physics.physics not-applicable stored audit card of heatsink_forced_convection: no PDE stated for this dataset
data.physics.constraint.r-base-k-w-0 pass stored audit card of heatsink_forced_convection: r_base_k_w > 0: 0 of 6000 rows violate it
data.physics.constraint.pressure-drop-pa-0 pass stored audit card of heatsink_forced_convection: pressure_drop_pa > 0: 0 of 6000 rows violate it
data.physics.constraint.source-width-mm-source-frac-w-base-width-mm pass stored audit card of heatsink_forced_convection: source_width_mm == source_frac_w * base_width_mm: 0 of 6000 rows violate it
data.physics.constraint.source-depth-mm-source-frac-d-base-depth-mm pass stored audit card of heatsink_forced_convection: source_depth_mm == source_frac_d * base_depth_mm: 0 of 6000 rows violate it
data.diversity.duplicates pass stored audit card of heatsink_forced_convection: train: 0 exact, 0 near copies of 3900; cal: 0 exact, 0 near copies of 600; test: 0 exact, 0 near copies of 900; val: 0 exact, 0 near copies of 600
data.diversity.effective pass stored audit card of heatsink_forced_convection: effective sample count 12 of 3900 (no generator stated: only a collapse to one pattern is flagged)
data.leakage pass stored audit card of heatsink_forced_convection: 0 of 900 test samples are (near) copies of train samples (closest: 0.392 x the median train spacing)

Model SHA-256 2ecc1bdef8460f1ce95dc92eb1f24ecdbc701b27ab4ab954a40087501e3789fb.

How to use

pip install "pinneapple @ git+https://github.com/PINNeAPPle-Labs/PINNeAPPle"
import pinneapple as pp

model = pp.zoo.load("heatsink_forced_mlp")          # weights checked against their SHA-256
inputs = {"base_width_mm": 44.7278, "base_depth_mm": 138.196, "base_thickness_mm": 3.54108, "n_fins": 15.0, "fin_thickness_mm": 0.81635, "fin_height_mm": 15.0093, "k_w_mk": 183.817, "source_width_mm": 13.5681, "source_depth_mm": 21.6939, "t_ambient_c": 27.7717, "air_velocity_m_s": 4.20166, "power_w": 297.703}
out = model.predict(inputs)                 # warns for inputs outside the validity range
print({k: round(float(v[0]), 6) for k, v in out.items()})
# {'r_base_k_w': 0.882924, 'pressure_drop_pa': 66.151017, 'r_base_upper95_k_w': 0.901249}
print(pp.zoo.query_checks(model, inputs)[0]["verdict"]["status"])   # per-query trust checks
# pass
print(pp.zoo.validate(model).decisao)        # card metrics reproduced + physics checks
# APPROVED

The inputs are the first held-out test case of the training dataset; its reference value is r_base_k_w = 0.874388, pressure_drop_pa = 65.4357. pp.zoo.evaluate("heatsink_forced_mlp") recomputes every metric of the card on the stored reference.

Hosted inference

No Hugging Face inference provider can run this model, so the Hub widget is off (inference: false). It is a small PyTorch network, but its prediction is more than a forward pass: the inputs are encoded and normalised, the outputs denormalised (and, for ensembles, averaged with their spread), and every query is checked against the validity range and the model's physics checks. The pinneapple library does all of that (below); the ONNX graph carries the pre- and post-processing but not the checks; the zoo demo Space shows the model along a sweep of each input and runs it, with its checks, in your browser.

ONNX

model.onnx (opset 17) maps x, shape (n, 12) float32 with the columns base_width_mm, base_depth_mm, base_thickness_mm, n_fins, fin_thickness_mm, fin_height_mm, k_w_mk, source_width_mm, source_depth_mm, t_ambient_c, air_velocity_m_s, power_w, to the outputs y: ['r_base_k_w', 'pressure_drop_pa', 'r_base_upper95_k_w']. Pre- and post-processing are in the graph (largest difference from PyTorch on the reference inputs: 1.8e-06); the validity-range and physics checks are not, so check the range yourself.

import numpy as np, onnxruntime as ort
from huggingface_hub import hf_hub_download

path = hf_hub_download("PINNeAPPle-Labs/heatsink-forced-mlp", "model.onnx", revision="v1.0.0.post1")
session = ort.InferenceSession(path)
x = np.array([[44.7278, 138.196, 3.54108, 15.0, 0.81635, 15.0093, 183.817, 13.5681, 21.6939, 27.7717, 4.20166, 297.703]], np.float32)
print(dict(zip([o.name for o in session.get_outputs()], session.run(None, {"x": x}))))

Files

File Content SHA-256
weights.pt PyTorch state_dict (torch.load(weights_only=True)), what pp.zoo.load reads 0c6e62e5e2b6f905276590235ff2133d6c880d1267db6dcebb6b72ba176529f8
config.json architecture and normalisation e556d11bb5562338c6355617e79a957af209a4e8ee96a3948c872a90c8b5ef41
model_card.json the model card: inputs, outputs, validity range, metrics, trust report 9be1bcadccc6ab9e073c0906c3eb4a039be30e6939490b4b8f7f9cefc9ec16b1
model.safetensors the same tensors as weights.pt in safetensors format (pinneapple_hub.zoo.export.load_safetensors loads them) derived
model.onnx ONNX graph, physical inputs to physical outputs (below) derived
example.json the "How to use" case: inputs, outputs, reference, verdicts derived

The SHA-256 are those of the package's manifest: pp.zoo.load refuses any other file.

Cite

If you use this model, please cite PINNeAPPle (software, Zenodo DOI 10.5281/zenodo.23343062; see CITATION.cff):

@software{pinneapple,
  author = {Barros, Yan and Schiassi, Enrico},
  title  = {PINNeAPPle},
  doi    = {10.5281/zenodo.23343062},
  url    = {https://github.com/PINNeAPPle-Labs/PINNeAPPle}
}
Downloads last month
34
Safetensors
Model size
51.6k params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Dataset used to train PINNeAPPle-Labs/heatsink-forced-mlp

Space using PINNeAPPle-Labs/heatsink-forced-mlp 1