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 mmair_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