Print FEA
Layer-line-aware FEA: analyze a printed part accounting for print orientation and layer-line anisotropy, backed by a print-materials database, to predict real printed-part strength rather than ideal-isotropic strength.
PreviewNot runnable yet
The worker route is not deployed; only print_process=fdm is solvable; the material model is an isotropic interface knockdown, not orthotropy; and the input is a G-code file rather than the part.
The solve that exists today is isotropic — it cannot yet tell you the one thing this process is for, which is whether a printed part fails between its layers before the material itself yields. So the anisotropic results below are listed as the goal, not served as findings. Study is the live process for ordinary (non-print-aware) stress work.
What it takes in
Geometry
- CAD fileComing soon
- File unitsReadymm · cm · m · in
- G-codeReadyOld goalThe current goal is to analyze the PART with orientation-aware anisotropy. Requiring G-code forces every user through a slicer before they can ask 'will my print hold', and it ties the mesh to toolpath voxelization rather than the part.
Material
- Print material (anisotropic)Coming soon
Print
- Print orientationPartialflat · on_edge · upright
- Build direction · unit vector in geometry coordinatesComing soon
- Layer height · mmPartial
- Layer adhesion / seam knockdownPartial
- AM processPartialfdm · sla · dlp · sls · lpbf
- Load case presetReadyOld goalcompress_top · bend_mid_spanPredicting a real printed part's strength needs the user's own fixtures and loads — the same supports/loads tagging Study already has. Two canned presets cannot express a real service load.
Mesh
- Quality tierReadydraft · standard · high · enterprise
- Design voxel · mmReady
Boundary
- Supports / fixturesComing soon
- LoadsComing soon
- Load distributionComing soonuniform · linear
What it gives back
Field
- Von Mises stressReady
- Displacement magnitudeReady
- Deformed shapeReady
- Anisotropic stress (in-plane vs build direction)Coming soonStress split into the in-plane component (strong, bulk material) and the build-direction component (weak, bonded between layers). Requires roadmap steps 3-4: an engine-side print-materials loader and an orthotropic constitutive path. Today's von Mises field comes from an ISOTROPIC solve with a stiffness knockdown near layer planes, so it cannot be relabelled as this.
- Interlayer bond utilizationComing soonWhere the print delaminates. This is the map that makes layer-line-aware FEA worth running rather than a generic stress plot: an FDM part fails between layers long before the bulk material yields. Needs yield_strength_z, which the web print-materials schema models and no engine code reads.
Metric
- Predicted printed-part strengthComing soonThe Print FEA goal's headline answer: the load this part survives AS PRINTED, and how much weaker that is than the ideal-isotropic assumption a normal FEA makes. Nothing computes it. Today's output is a stress field from a stiffness-knockdown model — directionally informed, but not a strength number. Needs roadmap steps 3-5.
- Governing failure modeComing soonInterlayer delamination vs bulk yield, and where. One sentence, and it is the sentence the maker reads first — 'this breaks between layers at the fillet' is actionable in a way a stress number is not.
- Orientation comparisonComing soonRank candidate build directions by predicted strength. Cheap once the orthotropic path exists (same mesh, same loads, rotated material frame) and it answers the question a maker actually has — 'which way up should I print this'. Roadmap step 6.
- Peak von Mises (Pa)ReadyOn optimize runs, prefer the validation_fea stage (final shape); the simp stage value is the in-loop post-check.
- Peak displacement (m)Ready
- ComplianceReady
- Bead mesh metadataReadyn_solid_hex, grid dims, bead_stamp, adhesion_model, n_seam_segments, layer_adhesion.
- Mesh statisticsReadyvoxel_clamped=true means the user did not get the voxel size they asked for. Surface it — it silently changes both runtime and result.
Diagnostics
- Run logReadyAlways written, including on failure. Carries status, per-stage status/notes/metrics, wall_time_s, peak_rss_mb, credits, acceptance, and error.
- CreditsReadycharged is 0 on a failed study.
What has to be built
- 1. Part-first input: accept a STEP/STL part plus a build direction and layer height, and mesh it on the standard design grid instead of requiring a sliced G-code file. G-code becomes an optional accuracy refinement (it carries real bead paths and seam positions that no part-level model can infer).
- 2. Real boundary conditions: accept `BoundaryConditions` (the supports/loads tagging Study already has) instead of the two canned coupon presets.
- 3. Engine-side print-materials loader: read the xy/z properties the web schema already models (`youngs_modulus_xy/z`, `poissons_ratio_xy/xz`, `shear_modulus_xz`, `yield_strength_xy/z`, `layer_adhesion_default`). Today `print_fea/engine.py` calls the ISOTROPIC `topoform.materials.get_material`.
- 4. Orthotropic constitutive path in `fea/assembly.py`, oriented by the build direction. This is what turns a directionally-knocked-down isotropic stress plot into a real anisotropic solve — docs/PRINT_FEA.md parks it at P3.
- 5. Strength prediction: compare in-plane stress against `yield_strength_xy` and build-direction stress against `yield_strength_z`, and report which one governs. That comparison IS the goal's headline answer.
- 6. Orientation comparison: re-solve across candidate build directions and rank them. Cheap once 1-5 exist, and it is the thing a maker actually wants to be told.