POD-NN Cold Plate Surrogate

A physically interpretable reduced-order surrogate that predicts the two-dimensional steady temperature field of a liquid-cooled, dual-chip, pin-fin cold plate from six boundary conditions — about 412,500 times faster than the CFD solve it replaces.

Trained artifacts from Curl & Hu (2026). Data: UARK-NED3/ColdPlate-CFD-2000sims (Dryad DOI 10.5061/dryad.k0p2ngfp5).

Why a POD basis rather than a direct field regressor

Predicting an 11,110-node field directly makes the network's internal representation opaque. Projecting the temperature snapshots onto a proper orthogonal decomposition basis first compresses the field to four coefficients that retain 99.32% of the temperature-field variance, and those four coefficients correspond to identifiable physical features. The network then only has to learn a six-input to four-output map. The paper uses that latent space for sensitivity analysis, thermal-resistance mapping, and design exploration — things a black-box field regressor does not support.

Architecture

Two stages. The neural network predicts POD coefficients; the POD basis reconstructs the field.

6 boundary conditions
  -> param_scaler (StandardScaler)
  -> Dense(64, ReLU, L2=1e-3) -> Dropout(0.1)
  -> Dense(64, ReLU, L2=1e-3) -> Dropout(0.1)
  -> Dense(32, ReLU, L2=1e-3)
  -> Dense(4)                                  # scaled POD coefficients
  -> mode_scaler inverse transform
  -> pca.inverse_transform                     # 4 modes -> 11,110 nodes
  -> temperature field (K) on the yz mid-plane

Optimizer Adam (lr = 1e-3), loss MSE.

Inputs and outputs

Input Units
chip1.thermal.heat_flux W/m²
chip2.thermal.heat_flux W/m²
inlet1.momentum.mass_flow_rate kg/s
inlet1.thermal.total_temperature K
inlet2.momentum.mass_flow_rate kg/s
inlet2.thermal.total_temperature K

Output: temperature (K) at 11,110 nodes on the central yz mid-plane. Node coordinates are in the dataset under the yz-mid|coordinates key of any sim_NNNN.npz.

Order the six inputs exactly as listed. It is the column order the scaler was fit on.

Files

File Contents
pod_nn.h5 Keras network weights
pca.pkl sklearn PCA: 4 retained POD modes and the snapshot mean
param_scaler.pkl sklearn StandardScaler for the 6 inputs
mode_scaler.pkl sklearn StandardScaler for the 4 POD coefficients
training_history.json Per-epoch train and validation MSE

All four of the first files are required. The .h5 alone does not produce a temperature field — it emits four scaled POD coefficients, and pca.pkl is what turns those into an 11,110-node field. For the same reason, a one-line keras.saving.load_model("hf://...") will not give you a working surrogate; use the snippet below.

Pickle notice. pca.pkl, param_scaler.pkl, and mode_scaler.pkl are Python pickles and unpickle into scikit-learn objects, so loading them executes code. They are published unmodified from the CC0 Dryad deposit. Load them only from this repository or the deposit, in an environment where you would run the authors' code anyway.

Training and evaluation

Training set sim_0001sim_0100 (100 simulations), 80/20 train/validation
Test set sim_1601sim_2000 (400 simulations)
Retained modes 4
Epochs 500 cap, batch size 8
Random seed 42

training_history.json records 379 epochs, so training stopped short of the 500 cap. The history also carries a learning_rate series, indicating a schedule was active. Final recorded loss 0.0498, validation loss 0.0387 (MSE in the scaled POD-coefficient space, not kelvin).

Reported test metrics: R² = 0.998, RMSE = 1.94 K, MAE = 1.46 K.

A 100-sample training set is enough to reach the error floor. The paper's decomposition analysis attributes the floor to the number of retained POD modes rather than to dataset size, so adding simulations does not help — add modes instead.

Limitations

  • Geometry-specific. The POD basis is fit to snapshots of one cold-plate geometry. It does not transfer to a different channel layout, pin-fin arrangement, or chip placement. A new geometry requires a new basis and a retrained network.
  • Interpolative within the sampled envelope. Boundary conditions were drawn by Latin Hypercube Sampling over the cold plate's operational space. Predictions outside that envelope are extrapolation, and the error floor reported above does not bound them.
  • Two-dimensional, one plane. The published surrogate predicts the central yz mid-plane only. The dataset also stores zx mid-plane and bottom-face fields, but no surrogate is released for them.
  • Steady state only. All training snapshots are steady solutions. The model carries no transient dynamics.
  • Not usable from CFDTwin. CFDTwin (arXiv:2605.27725) is the production successor to this workflow, but its release cannot load this snapshot's data format, and these artifacts are not a CFDTwin model file. Use CFDTwin against your own Fluent case; use this repository to reproduce the paper.

Usage

import pickle
import numpy as np
from huggingface_hub import hf_hub_download
from tensorflow.keras.models import load_model

REPO = "UARK-NED3/PODNN-ColdPlate"
get = lambda f: hf_hub_download(REPO, f)

net    = load_model(get("pod_nn.h5"), compile=False)
pca    = pickle.load(open(get("pca.pkl"), "rb"))
p_scal = pickle.load(open(get("param_scaler.pkl"), "rb"))
m_scal = pickle.load(open(get("mode_scaler.pkl"), "rb"))

# [chip1 q", chip2 q", inlet1 mdot, inlet1 T0, inlet2 mdot, inlet2 T0]
x = np.array([[40000.0, 35000.0, 0.010, 300.0, 0.010, 300.0]])

coeffs = m_scal.inverse_transform(net.predict(p_scal.transform(x), verbose=0))
field  = pca.inverse_transform(coeffs)      # (1, 11110) temperature in K
print(field.shape, field.min(), field.max())

Requires TensorFlow/Keras, scikit-learn, and NumPy ≥ 1.20.

The three pickles were written by scikit-learn 1.7.2 (read from the _sklearn_version field embedded in each file). Install that version to avoid unpickling warnings or silent attribute mismatches. The deposit's requirements.txt pins nothing — it lists bare package names — so 1.7.2 is the only recoverable version fact, and the exact TensorFlow build used for training is not recorded anywhere in the release.

Reproducing

The dataset repository carries the full pipeline under 3_SourceCode/. Run 01_train_model.py first to regenerate these artifacts, then scripts 02–12 for the paper's figures. Every script seeds NumPy and TensorFlow with RANDOM_SEED=42; with matching library versions, runs reproduce the published numbers.

Citation

Curl, D. and Hu, H. 2026. Physically interpretable surrogate modeling of thermal fields in electronics cooling using combined proper orthogonal decomposition and neural networks. AI Thermal Fluids 6, 100040. https://doi.org/10.1016/j.aitf.2026.100040

Data: 10.5061/dryad.k0p2ngfp5 · Software: Curl, D. and Hu, H. CFDTwin: An open-source GUI and Python toolkit for POD-NN surrogate modeling of ANSYS Fluent simulations. arXiv:2605.27725 (2026).

Funding

U.S. National Science Foundation award OIA-2429580, EPSCoR Research Fellow: NSF: Immersion Cooling of Interior Permanent Magnet Synchronous Motors with Additively Manufactured Stator Windings (award page).

License

CC0 1.0 Universal (public domain dedication), matching the Dryad deposit these artifacts come from. Note that CFDTwin itself is released separately under the MIT License.

Contact

Han Hu, Associate Professor of Mechanical Engineering, University of Arkansas — hanhu@uark.edu

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Dataset used to train UARK-NED3/PODNN-ColdPlate

Paper for UARK-NED3/PODNN-ColdPlate