75 lines
4.7 KiB
Markdown
75 lines
4.7 KiB
Markdown
|
|
# 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.
|