PhysicsNeMo-Mesh: GPU-Native Meshes and Simulation Cases for Physics AI
Organizations: NVIDIA Corporation
Abstract
PhysicsNeMo-Mesh is the mesh module of the open-source PhysicsNeMo library. It provides mesh processing similar to PyVista, but on the GPU, in batches, and inside PyTorch's automatic differentiation. Like xarray for unstructured meshes, it attaches semantics to data: fields on points, cells, and whole meshes have names and shapes, and a simulation case keeps the complete PDE problem specification, including boundary conditions and their prescribed values. It addresses three problems that plague machine learning for physical simulation. First, GPU utilization is bottlenecked by I/O, because samples are very large relative to the compute per forward pass. Second, because traditional preprocessing is expensive, it is necessarily done once, during curation, rather than differently for each model and workflow at the point of use. Finally, advanced equivariant and mesh-native architectures require information that curation ordinarily discards. Fast GPU mesh processing makes it practical to preprocess at the point of use: on one GB200 GPU, mesh operations run faster than VTK with 72 threads, and loading a whole case is faster than reading its VTK files ( when both read the same fields). Overlapped with training, this preprocessing costs of throughput for a Transolver step. So one dataset serves many models and workflows: in PhysicsNeMo's public recipe, one stored DrivAerML dataset feeds Transolver, GeoTransolver, and GLOBE. PhysicsNeMo-Mesh combines the speed of an intermediate array store with the flexibility of an archival format such as VTK. When shapes and wall conditions both vary, per-boundary conditions cut a heat-conduction error from to . And by keeping field ranks and named boundaries, it retains the semantic structure that next-generation architectures will need.
Figures & tables
| PyVista (VTK, CPU) | PhysicsNeMo-Mesh (GPU) | Speedup |
|---|---|---|
| car.transform(R, ...) | car.rotate(a, "z", ...) | 6.2 |
| car.reflect(n).append_polydata(car) | Mesh.merge([car, car.transform(M)]) | 76 |
| car.extract_cells(ids) | car.slice_cells(mask) | 968 b |
| car.compute_normals(...) | car.cell_normals | 12 |
| pts.compute_implicit_distance(car) | signed_distance_field(car, pts) | 350 |
| car.fill_holes(size) | fill_holes(car) | 20 b |
| Cold load of one case | Size on disk [GB] | ||||||
|---|---|---|---|---|---|---|---|
| Dataset | VTK read | + conversion | PhysicsNeMo-Mesh | Speedup | VTK | PhysicsNeMo-Mesh | Ratio |
| DrivAerML | 88 | 49.7 | 6.3 | 7.9 | |||
| HiLiftAeroML | † | ‡ | 8.0 | 107.3 | 20.0 | 5.4 | |
| SHIFT-SUV | 56 | 4.4 | 1.6 | 2.7 | |||
Appendix figures & tables4 assets
Supplementary material from the paper’s appendix.
Appendix
| Operation | CPU | GPU | Speedup | Peak GPU [GB] |
| DrivAerML car surface, 17,684,913 triangles | ||||
| Linear subdivision, one level | 1,068 | 6.8 | ||
| Subset by tag b | 968 | 1.4 | ||
| Remesh to 200,000 points a | 639 | 2.0 | ||
| Area-weighted sampling, points a | 550 | 2.0 | ||
| Loop subdivision, one level | 531 | 12.6 | ||
| Operation | Mesh | Largest size | GPU time | CPU time | Peak GPU [GB] |
|---|---|---|---|---|---|
| Area-weighted sampling, points a | Triangles | 336M | 32 | ||
| Cell normals | Triangles | 336M | 27 | ||
| Field transfer, queries | Tetrahedra | 384M | – | 153 | |
| Gradient (least squares) | Tetrahedra | 257M | 58 |
| 6.0M parameters | 1.7M parameters | |||
|---|---|---|---|---|
| Configuration | Steps/s | Cost | Steps/s | Cost |
| A: precomputed features (no augmentation) | 7.87 | – | 46.33 | – |
| B: on the fly, serial | 7.41 | 5.9% | 32.95 | 28.9% |
| C: on the fly, DataLoader | 7.70 | 2.1% | 30.07 | 35.1% |
| D: on the fly, DataLoader, cached geometry | 7.73 | 1.8% | 29.92 | 35.4% |
| Training step alone [ms] | 127.0 | 22.6 | ||
| Model | Floor | Geometry only | + global BC vector | + per-boundary BC | |
|---|---|---|---|---|---|
| Transolver | 0 | 0.000 | 0.009 (0.008–0.010) | 0.009 (0.008–0.010) | 0.011 (0.010–0.011) |
| 0.1 | 0.112 | 0.113 (0.113–0.115) | 0.087 (0.079–0.101) | 0.042 (0.037–0.046) | |
| 0.25 | 0.277 | 0.278 (0.277–0.280) | 0.144 (0.139–0.152) | 0.050 (0.048–0.054) | |
| 0.5 | 0.526 | 0.529 (0.527–0.532) | 0.251 (0.241–0.263) | 0.066 (0.063–0.075) | |
| 1 | 0.850 | 0.866 (0.863–0.867) | 0.457 (0.440–0.462) | 0.094 (0.067–0.108) | |
| 2 | 0.967 | 0.980 (0.978–0.982) | 0.542 (0.529–0.558) | 0.100 (0.079–0.194) |
GPU Acceleration
GPU acceleration uses parallel processors, specialized kernels, and memory-aware systems to speed computation across AI and scientific workloads.
See all 174 papers