physicsnemo icon indicating copy to clipboard operation
physicsnemo copied to clipboard

domino crash model arch and example

Open RishikeshRanade opened this issue 1 month ago • 2 comments

PhysicsNeMo Pull Request

Description

Checklist

  • [ ] I am familiar with the Contributing Guidelines.
  • [ ] New or existing tests cover these changes.
  • [ ] The documentation is up to date with these changes.
  • [ ] The CHANGELOG.md is up to date with these changes.
  • [ ] An issue is linked to this pull request.

Dependencies

RishikeshRanade avatar Oct 27 '25 19:10 RishikeshRanade

This PR has a lot of repetition from the DoMINO aerodynamics example, especially in the model. Can it be consolidated? If the original model code is not able to do so, can it be updated to accommodate both examples?

coreyjadams avatar Oct 28 '25 00:10 coreyjadams

Greptile Overview

Greptile Summary

This PR introduces the DoMINO transient model architecture and crash simulation example for structural mechanics, enabling time-series displacement prediction on deformable surfaces.

Key Changes

  • New domino_transient model module with implicit/explicit integration schemes for time-series prediction
  • Crash simulation datapipe (CrashDataset) for loading VTP displacement files and computing time-series features
  • Example training/testing scripts for structural mechanics use case
  • Support for transient modeling with configurable integration schemes

Critical Issues Found

Multiple bugs will cause runtime failures:

  1. encodings.py:148 - calculate_total_neighbors_in_radius returns uninitialized variable for invalid geo_encoding_type
  2. utils.py:405-418 - Tensor shape mismatch in metrics computation causes IndexError (sum removes feature dimension but code indexes it)
  3. crash_datapipe.py:72 - Creates scalar instead of array for indices
  4. domino_datapipe_transient.py:658 - Missing timesteps parameter causes NameError in transient mode
  5. crash_datapipe.py:132-141 - Implicit scheme creates mismatched tensor shapes between inputs (N-1) and expected targets
  6. test.py:168-177 - Implicit rollout broadcasts same displacement to all neighbors incorrectly

Documentation Issue

README describes aerodynamics/DrivAerML dataset instead of crash simulation use case - needs complete rewrite

Recommendations

  • Fix all critical bugs before merge (especially tensor shape issues and missing parameters)
  • Verify implicit integration scheme logic with unit tests
  • Update README for crash simulation domain
  • Add validation that geo_encoding_type is valid

Confidence Score: 1/5

  • This PR has multiple critical bugs that will cause runtime failures in both training and inference
  • Score of 1 reflects 6+ critical bugs that will cause exceptions: uninitialized variables, tensor shape mismatches causing IndexError, missing function parameters causing NameError, and incorrect array initialization. These are not edge cases - they will fail immediately when running transient models or computing metrics
  • Critical attention needed: examples/structural_mechanics/crash_domino/src/utils.py (metrics will crash), physicsnemo/datapipes/cae/domino_datapipe_transient.py (missing parameter), examples/structural_mechanics/crash_domino/src/crash_datapipe.py (array initialization + implicit scheme logic), physicsnemo/models/domino_transient/encodings.py (uninitialized return)

Important Files Changed

File Analysis

Filename Score Overview
physicsnemo/models/domino_transient/encodings.py 2/5 implements geometry encoding for transient DoMINO model. contains critical bug at line 148: calculate_total_neighbors_in_radius returns uninitialized variable if geo_encoding_type is invalid
examples/structural_mechanics/crash_domino/src/utils.py 1/5 utility functions for crash simulation. critical bug at lines 405-418: tensor shape mismatch in metrics_fn_surface will cause IndexError - sum operation removes feature dimension but code tries to index it
examples/structural_mechanics/crash_domino/src/crash_datapipe.py 2/5 crash dataset loader. critical bug at line 72: creates scalar instead of array. implicit scheme logic issue at lines 132-141: mismatched tensor dimensions between inputs and targets
physicsnemo/datapipes/cae/domino_datapipe_transient.py 2/5 transient datapipe for DoMINO. critical bug: process_volume method missing timesteps parameter in signature but uses it on lines 716-755, will cause NameError for transient models
examples/structural_mechanics/crash_domino/src/test.py 2/5 inference script for crash model. implicit scheme autoregressive rollout has bug at lines 168-177: broadcasts same displacement to all neighbors, causing incorrect position updates
examples/structural_mechanics/crash_domino/README.md 1/5 documentation file. content describes external aerodynamics and DrivAerML dataset but file is in crash_domino directory. entire README needs rewrite for crash simulation use case

Sequence Diagram

sequenceDiagram
    participant User
    participant TrainScript as train.py
    participant DataPipe as DoMINODataPipe
    participant CrashDS as CrashDataset
    participant Model as DoMINO
    participant Loss as compute_loss_dict
    
    User->>TrainScript: Start training
    TrainScript->>TrainScript: Load scaling factors
    TrainScript->>DataPipe: create_domino_dataset()
    DataPipe->>CrashDS: Initialize dataset
    CrashDS->>CrashDS: Load VTP files with time-series displacements
    
    loop Each Epoch
        loop Each Batch
            TrainScript->>DataPipe: Get batch
            DataPipe->>CrashDS: __getitem__(idx)
            CrashDS->>CrashDS: Read displacement VTP file
            CrashDS->>CrashDS: Extract surface coordinates + displacements
            alt Implicit Scheme
                CrashDS->>CrashDS: Compute delta displacements (N-1)
            else Explicit Scheme
                CrashDS->>CrashDS: Use absolute displacements (N)
            end
            CrashDS-->>DataPipe: Return raw data dict
            
            DataPipe->>DataPipe: process_surface()
            DataPipe->>DataPipe: Downsample points & compute kNN neighbors
            DataPipe->>DataPipe: Normalize coordinates
            DataPipe->>DataPipe: Scale surface fields
            DataPipe-->>TrainScript: Preprocessed batch
            
            TrainScript->>Model: forward(batch)
            Model->>Model: Compute geometry encodings
            Model->>Model: Compute positional encodings
            alt Implicit Integration
                loop integration_steps
                    Model->>Model: Update positions with predictions
                    Model->>Model: Predict displacement delta
                end
            else Explicit Integration
                loop timesteps
                    Model->>Model: Predict displacement for timestep
                end
            end
            Model-->>TrainScript: predictions (vol, surf)
            
            TrainScript->>Loss: compute_loss_dict()
            Loss->>Loss: Compute MSE or relative MSE
            Loss-->>TrainScript: loss value
            
            TrainScript->>TrainScript: Backprop & update weights
        end
        
        TrainScript->>TrainScript: Validation step
        TrainScript->>TrainScript: Save checkpoint if improved
    end

greptile-apps[bot] avatar Nov 12 '25 20:11 greptile-apps[bot]