4.7 KiB
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:
trianglelibrary (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.pyvia 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.