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, andmode_scaler.pklare 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_0001–sim_0100 (100 simulations), 80/20 train/validation |
| Test set | sim_1601–sim_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