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

4.7 KiB
Raw Blame History

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.