diff --git a/examples/structural_mechanics/crash/README.md b/examples/structural_mechanics/crash/README.md index 514c1c792e..167aae4d90 100644 --- a/examples/structural_mechanics/crash/README.md +++ b/examples/structural_mechanics/crash/README.md @@ -637,6 +637,125 @@ Muon: Car-crash test MSE at probe location (Driver, Passenger):

+## Community Dataset: OpenRadioss Bumper Beam + +This section describes an open-source dataset generated with +[OpenRadioss](https://github.com/OpenRadioss/OpenRadioss) and contributed by the community +to provide a freely accessible alternative for experimenting with this example. + +### Dataset Overview + +

+ +

+ +The dataset is based on the +[OpenRadioss Bumper Beam example](http://openradioss.atlassian.net/wiki/spaces/OPENRADIOSS/pages/11075585/Bumper+Beam), +a standard crash benchmark consisting of a bumper beam impacting a rigid cylindrical pole. +Raw simulation data was generated by iteratively varying two design parameters across 131 runs: + +| Parameter | Range | Description | +|---|---|---| +| Shell thickness | 1.2 mm – 2.0 mm | Applied uniformly to `PROP/SHELL` IDs 2 and 7 | +| Pole Y-axis offset | −500 mm – +500 mm | Shifts the rigid pole impact position along the beam | + + +OpenRadioss ANIM output files are first converted to **d3plot** format using +[Vortex-Radioss](https://github.com/Vortex-CAE/Vortex-Radioss), then curated to **VTP** format +using [PhysicsNeMo-Curator](https://github.com/NVIDIA/physicsnemo-curator) for training. + +The dataset (131 runs, including both raw d3plot and curated VTP files) is publicly available +on Hugging Face: + +> 🤗 **[AIRBORNEPANDA/BumperBeamCrashExample](https://huggingface.co/datasets/AIRBORNEPANDA/BumperBeamCrashExample)** + +### Generating the Dataset Yourself + +A full data generation pipeline is provided at +**[HoussemMouradi/OpenRadioss2PhysicsNeMo](https://github.com/HoussemMouradi/OpenRadioss2PhysicsNeMo)**. +It automates the complete workflow: modifying OpenRadioss input decks, running the solver, +converting ANIM → d3plot, and generating `GLOBAL_FEATURES.json`. + +Interactive Jupyter notebooks walk through every step and handle all dependency installation +automatically: + +| Platform | Notebook | +|---|---| +| Windows (local Jupyter) | [OpenRadioss2PhysicsNEMO_windows.ipynb](https://github.com/HoussemMouradi/OpenRadioss2PhysicsNeMo/tree/main/OpenRadioss2PhysicsNeMo_Notebooks/OpenRadioss2PhysicsNeMo_windows.ipynb) | +| Linux (local Jupyter) | [OpenRadioss_PhysicsNEMO_linux.ipynb](https://github.com/HoussemMouradi/OpenRadioss2PhysicsNeMo/tree/main/OpenRadioss2PhysicsNeMo_Notebooks/OpenRadioss2PhysicsNeMo_linux.ipynb) | +| Google Colab ☁️ | Open In Colab | + +After running a notebook, follow the +[PhysicsNeMo-Curator crash ETL instructions](https://github.com/NVIDIA/physicsnemo-curator/blob/main/examples/structural_mechanics/crash/README.md) +to curate the d3plot outputs to VTP format for training. + +### Training Configuration + +The following configuration was used to train on the Bumper Beam dataset. It is based on the +[`bumper_geotransolver_oneshot.yaml`](https://github.com/NVIDIA/physicsnemo/blob/main/examples/structural_mechanics/crash/conf/bumper_geotransolver_oneshot.yaml) +experiment preset, using the **VTP reader**, **GeoTransolver (one-shot)** model, and +**point cloud** datapipe. + +Run with: + +```bash +python train.py --config-name=bumper_geotransolver_oneshot +``` + +The key configuration values are: + +```yaml +# Bumper beam crash experiment using GeoTransolver (one-shot). +# Usage: python train.py --config-name=bumper_geotransolver_oneshot + +experiment_name: "Bumper-GeoTransolver" + +defaults: + - reader: vtp + - datapipe: point_cloud + - model: geotransolver_one_shot + - training: default + - inference: default + - _self_ +# -- Data ---------------------------------------------------------------------- +training: + raw_data_dir: ./CURATED_DATA_VTP/TRAINING_DATA # path to curated VTP train split + raw_data_dir_validation: ./CURATED_DATA_VTP/VALIDATION_DATA # path to curated VTP validation split + global_features_filepath: ./CURATED_DATA_VTP/GLOBAL_FEATURES.json # path to GLOBAL_FEATURES.json + optimizer: muon + +# -- Dataset ------------------------------------------------------------------- +num_time_steps: 11 +num_training_samples: 124 +num_validation_samples: 7 + +inference: + raw_data_dir_test: ??? + +# -- Datapipe features --------------------------------------------------------- +datapipe: + static_features: [thickness] # per-node static features for this dataset + dynamic_targets: + - effective_plastic_strain + - stress_vm + global_features: + - thickness_scale # shell thickness (mm) + - velocity_x # initial impact velocity in X (mm/ms) + - rwall_origin_y # rigid pole Y-coordinate (mm) + sample_type: all_time_steps + +# -- Model --------------------------------------------------------------------- +model: + functional_dim: 4 # input coords (x, y, z) + static_features (1) + out_dim: 50 # (num_time_steps - 1) * 5 = 10 * 5 = 50 + global_dim: 3 # must match len(datapipe.global_features) +``` + +### Results +1769108712488 +1769108706907 + + ## TODO - [ ] **Normalize global features**: Global features (e.g., velocity_x, thickness_scale, rwall_origin_y) are currently passed to the model without normalization. Add support for computing and applying per-feature mean/std (or similar) so global inputs are normalized consistently with node features and positions.