Files
Atomizer/projects/isogrid-dev-plate/DECISIONS.md
2026-02-19 08:00:36 +00:00

75 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Decision Log — Isogrid Dev Plate
> Living document. Record every meaningful technical decision with rationale.
> Date: YYYY-MM-DD | Author: [role]
---
## D-001 — Gmsh Frontal-Delaunay as production mesher
**Date:** 2026-02 | **Author:** Python Brain dev
**Decision:** Use Gmsh `Algorithm 6` (Frontal-Delaunay) instead of the `triangle` library.
**Rationale:**
- Background size fields handle density variation in one pass (no iterative refinement)
- Better triangle quality (min angles 3035° vs 2530° with triangle library)
- Better boundary conformance for complex sandbox shapes
- Boolean geometry operations for cleaner hole handling
**Alternatives considered:** `triangle` library (rejected: weaker quality, more passes needed)
---
## D-002 — Update-in-place sketch for NX import
**Date:** 2026-02 | **Author:** Antoine + Claude
**Decision:** `import_profile.py` detects existing ISOGRID_RIB_sandbox_N sketch and clears it in-place instead of deleting and recreating.
**Rationale:** Creating a new sketch breaks the existing extrude (ISOGRID_EXTRUDE) reference.
NXOpen `GetAllGeometry()` + `AddObjectsToDeleteList()` + `DoUpdate()` clears all curves while preserving the sketch object itself → extrude reference stays valid.
**Implementation:** `_find_sketch_by_name()` + `_clear_sketch_geometry()` in `import_profile.py`.
**Alternatives considered:** Delete+recreate sketch (rejected: loses extrude reference, forces manual reassociation every iteration).
---
## D-003 — Do not import outer boundary or bolt holes into NX sketch
**Date:** 2026-02 | **Author:** Antoine
**Decision:** `DRAW_OUTER_BOUNDARY = False`, `DRAW_HOLES = False` in `import_profile.py`.
**Rationale:** The subtract workflow only needs pocket profiles. The sandbox outer boundary and bolt holes already exist as geometry in the NX body — reimporting them as curves causes conflicts.
**Config:** Two boolean flags at the top of `import_profile.py`.
---
## D-004 — 8 optimized variables, 9 fixed (manufacturing + math constants)
**Date:** 2026-02 | **Author:** Technical Lead
**Decision:** Atomizer design space = 8 variables only. Manufacturing constraints and math constants are fixed parameters, not design variables.
**Classification:**
- **Optimized (8):** eta_0, alpha, beta, gamma_stress, R_0, R_edge, s_min, s_max
- **Fixed — manufacturing (7):** t_min=2.5, t_0=3.5, w_frame=5.0, r_f=1.5, d_keep=1.2, min_pocket_radius=6.0, min_triangle_area=25.0
- **Fixed — math (3):** p=2.0, kappa=1.0, gamma=1.0
**Rationale:** Manufacturing constraints are process-specific and should not be optimized away (unsafe tolerances). Math constants govern the functional form and are stable at well-understood defaults.
**See:** `BREAKDOWN.md` §2 for full classification table.
---
## D-005 — 3D solid FEA instead of 2D shell
**Date:** 2026-02 | **Author:** Antoine
**Decision:** Use 3D solid mesh (CHEXA/CTETRA) for FEA, not 2D shell midsurface.
**Rationale:** More detail in the actual thickness stress distribution. Enables better stress field extraction through thickness.
**Impact:** Stress extraction requires through-thickness averaging:
- Element centroids at same (u,v) sandbox location but different z → averaged to single 2D stress value
- Implemented in `extract_stress_field_2d.py` via rounding to 0.1mm and grouping.
**Alternatives considered:** 2D shell midsurface (simpler, faster — deferred to later if 3D solve time is too slow).
---
## D-006 — Gaussian blur before RBF interpolation for stress feedback
**Date:** 2026-02 | **Author:** Technical Lead
**Decision:** Apply Gaussian blur (radius ~40mm) on a rasterized grid before fitting the RBF interpolator in `StressFeedbackField`.
**Rationale:** Raw stress fields from FEA have sharp local peaks (especially at hole edges, load application points). Without smoothing, the density field would create local over-densification that oscillates between iterations. Blurring produces a smooth, spatially coherent stress signal.
**Implementation:** `StressFeedbackField._smooth()` → rasterize scatter → `scipy.ndimage.gaussian_filter` → re-sample → RBF.
---
## D-007 — Single-objective (mass) with constraint penalties
**Date:** 2026-02 | **Author:** Technical Lead
**Decision:** Minimize mass with stress and displacement as penalty constraints.
**Rationale:** Mass is the clear primary objective. Stress and displacement are hard limits, not trade-off objectives. Single-objective TPE converges faster than NSGA-II for this problem.
**Formula:** `objective = mass + 1e4 × constraint_violation²`
**Future:** If exploring mass vs. stress trade-offs is desired, switch to multi-objective (NSGA-II) with OP_11 protocol.