Files
Atomizer/tools/adaptive-isogrid
Antoine fbdafb9a37 fix(extract): discover UF curve eval methods dynamically
NXOpen Python wraps UF methods with version-specific names.
Now dumps available methods on UF.Modl, UF.Eval, UF.Curve
and tries them in order. Detailed logging shows which method
was found and used, plus raw result format on parse failures.
2026-02-17 01:33:39 +00:00
..

Adaptive Isogrid — Plate Lightweighting Tool

Status: Foundation / Pre-Implementation
Architecture: Python Brain + NX Hands + Atomizer Manager

What It Does

Takes a plate with holes → generates an optimally lightweighted isogrid pattern → produces manufacturing-ready geometry. Isogrid density varies across the plate based on hole importance, edge proximity, and optimization-driven meta-parameters.

Architecture

Component Role Runtime
Python Brain Density field → Constrained Delaunay → rib profile ~1-3 sec
NX Hands Import profile → mesh → AFEM merge → Nastran solve → extract results ~60-90 sec
Atomizer Manager Optuna TPE sampling → objective evaluation → convergence 500-2000 trials

Key Insight: Assembly FEM with Superposed Models

  • Model A (permanent): Spider elements at holes + edge BC nodes. All loads/BCs applied here.
  • Model B (variable): 2D shell mesh of ribbed plate. Rebuilt each iteration.
  • Node merge at fixed interface locations connects them reliably every time.

Loads and BCs never need re-association. Only the rib pattern changes.

Directory Structure

adaptive-isogrid/
├── README.md
├── requirements.txt
├── docs/
│   └── technical-spec.md          # Full architecture spec
├── src/
│   ├── brain/                     # Python geometry generator
│   │   ├── __init__.py
│   │   ├── density_field.py       # η(x) evaluation
│   │   ├── triangulation.py       # Constrained Delaunay + refinement
│   │   ├── pocket_profiles.py     # Pocket inset + filleting
│   │   ├── profile_assembly.py    # Final plate - pockets - holes
│   │   └── validation.py          # Manufacturing constraint checks
│   ├── nx/                        # NXOpen journal scripts
│   │   ├── extract_geometry.py    # One-time: face → geometry.json
│   │   ├── build_interface_model.py  # One-time: Model A + spiders
│   │   └── iteration_solve.py     # Per-trial: rebuild Model B + solve
│   └── atomizer_study.py          # Atomizer/Optuna integration
└── tests/
    └── test_geometries/           # Sample geometry.json files

Implementation Phases

  1. Python Brain standalone (1-2 weeks) — geometry generator with matplotlib viz
  2. NX extraction + AFEM setup (1-2 weeks) — one-time project setup scripts
  3. NX iteration script (1-2 weeks) — per-trial mesh/solve/extract loop
  4. Atomizer integration (1 week) — wire objective function + study management
  5. Validation + first real project (1-2 weeks) — production run on client plate

Quick Start (Phase 1)

cd tools/adaptive-isogrid
pip install -r requirements.txt
python -m src.brain --geometry tests/test_geometries/sample_bracket.json --params default

Parameter Space

15 continuous parameters optimized by Atomizer (Optuna TPE):

  • Density field: η₀, α, R₀, κ, p, β, R_edge
  • Spacing: s_min, s_max
  • Rib thickness: t_min, t₀, γ
  • Manufacturing: w_frame, r_f, d_keep

See docs/technical-spec.md for full formulation.