# 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 30–35° vs 25–30° 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.