Files
OneCAD-Simulation/docs/parity.md
T
5afd1addb9 Structured hex: extrude, revolve, sweep and mapped all-hex meshing (M5) (#40)
* Structured hex meshing: multi-level extrude and revolve, one-to-one sweep, mapped blocks (M5)

modelcraft_mesh::hex::hex_mesh meshes a face-tagged boundary surface with
hexahedra by the first structured method that fits: a straight or
rotational multi-level sweep (imprinted cross-section arrangement, cuts at
reflex corners, mapped/annulus/free regions), a one-to-one sweep through
rings of linking faces (least-squares affine layers with residual
correction), or a mapped logical cube (trivariate transfinite
interpolation). Interval assignment couples shared curves; boundary quads
carry B-rep face tags; the certified validity gate, a tiling check and a
fidelity check guard the output; hex20 mid-edge nodes go onto the faces.
Shape::face_surfaces exposes the analytic face surfaces; the corpus runner
gets a structured hex column.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

* mesh.hex.generate: structured hex meshing as a command

Meshes one body, every body of the open design or an imported surface,
replaces the mesh, tags element faces with the B-rep faces (so sets by
geometry resolve) and reports per body the method, counts and quality.
The quality pass certifies each element once and feeds the validity gate
(quality::validity_gate_checks). Shape::size gives the cached body size
for defaults instead of a full measure.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

* Hex: disk O-grids, convex interval cost, early size guard, hex20 corpus column

Smooth single-loop sections (cylinders, tori, vases) get a butterfly O-grid
instead of the free mesher; interval assignment raises counts by the
squared relative error so equal sides share increments evenly; a mesh far
beyond the element limit is refused before any work and mapped limits are
no longer swallowed. The corpus reports hex8 and hex20 quality.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

* Catalogue: structured hex commands ready (mesh.hex.sweep, mesh.hex.mapped, mesh.hex.generate)

mesh.hex.sweep and mesh.hex.mapped run mesh.hex.generate with the sweeping
methods or the mapped one; mesh.hex.generate is the sweep entry's related
command. The planned M6 octree entry moves to mesh.hex.octree (its icon
renamed with it). docs/features.md regenerated.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

* Docs: structured hex literature (B8), architecture, roadmap, parity; corpus hex column

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

* Hex: simplify review fixes

Prepare each sweep frame's cross-section once (arrangement, cuts, fill)
and reuse it across refinement retries; candidate frames come from one
setup pass. Edge triangles come from the feature edges, layer counts go
through size::edge_divisions, sweep residual weights are computed once
per node, flux shape functions live on the stack, and the arrangement's
exact side test and distances serve the region probe. The engine takes
the boundary options mesh.tet.generate takes and names unnamed faces by
index like it; the corpus hex20 run reuses the winning method; the
mapped entry lists mesh.hex.generate too; the octree icon is redrawn
under its new id.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

* Regenerate docs/features.md and docs/meshing/corpus.md after rebasing

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

* Regenerate docs/features.md and docs/meshing/corpus.md after rebasing onto main

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

* Regenerate docs/features.md and docs/meshing/corpus.md after rebasing onto main

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

* Regenerate docs/features.md and docs/meshing/corpus.md after rebasing onto main

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

* Regenerate docs/features.md after rebasing onto main

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

* Regenerate docs/features.md after rebasing onto main

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

* Regenerate docs/features.md after rebasing onto main

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

---------

Co-authored-by: jyviko <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-13 22:25:50 -04:00

11 KiB
Raw Blame History

Capability checklist (reference: Abaqus/CAE)

What an analyst does in a full CAE pre-processor, grouped by milestone, with ModelCraft's status. Scope comes from the public documentation of Abaqus/CAE and public analyst discussion, described in our own words; nothing was taken from the product itself (AGENTS.md: no commercial products are run, no documentation text is copied). Status: done, started, planned. HEX marks items centred on hexahedral meshing, the core goal.

Where we aim to be better

# Opportunity Why analysts want it ModelCraft approach
1 Hex meshes without manual partitioning Partitioning a part into sweepable cells by hand is the most cited chore Sweep and mapped meshing with automatic decomposition that proposes SolidCraft splits (M5); octree all-hex for anything else (M6)
2 Undo, redo, replay, crash recovery No general undo; replay files are hard to reuse; corrupted model files Every action is a journalled command with rollback, undo and redo; autosave with recovery after a crash
3 Sets that survive changes Sets and loads break when geometry regenerates or is remeshed Sets bind to SolidCraft's persistent face, edge and body names and resolve after meshing (M3)
4 An API that is not a bundled scripting runtime Version breakage, slow scripts, geometry picked by position JSON commands over CLI, control channel and MCP
5 Located diagnostics Generic error messages Errors name the element, face or keyword; mesh.quality lists failing elements
6 Lossless deck round trip Unsupported keywords dropped on import Deck readers keep unknown keywords and write them back (M9)
7 Safe, diffable model files Binary model databases that corrupt or lock to a version .modelcraft: text, line-diffable definition and journal, checksummed binary mesh, versioned format tag, atomic saves with backup, autosave (M3, done)
8 Geometry checked before meshing Slivers and tiny faces fail late Surface preparation reports defects with their location (M1)
9 No size caps, any solver Node limits in learning editions; one solver per tool Free, open source, three deck formats
10 Clear step history Loads and BCs propagate between steps implicitly An explicit step × load/BC table (M3)

Checklist

Area Capability Milestone HEX Status
Geometry Open SolidCraft designs, bodies, persistent face names, assemblies placed M1 done
Geometry Face-tagged mesh import (3MF) M1 done
Geometry Weld, closed/manifold/orientation and self-intersection checks, feature edges M1 yes started
Geometry Partitions and datums as SolidCraft features (split body/face, construction planes) M5 yes planned
Geometry Midsurface extraction for shells M8 planned
Mesh Size field: global, per face and edge seeds, bias, curvature and proximity refinement M2 yes planned
Mesh Free tet meshing (tet4, tet10 with mid-side nodes on the geometry) M2 started
Mesh Quality metrics, certified validity, verify per set M1–M2 yes done (metrics, gate)
Mesh 2D quad meshing of faces M5 yes started (modelcraft_mesh::quad; mesh.planar: 2D models of a polygon or a planar face, quad4/quad8/tri3/tri6, edges tagged by their neighbouring face)
Mesh Mapped hex of six-sided regions M5 yes done (mesh.hex.mapped)
Mesh Sweep hex (extrusions, revolutions) M5 yes done (mesh.hex.sweep: multi-level extrusions, revolutions, one-to-one sweeps)
Mesh Automatic decomposition into sweepable and mappable regions M5 yes planned
Mesh Conforming interfaces, tet–hex transition with pyramids M5 yes planned
Mesh Octree/grid-dual all-hex for any part M6 yes planned
Mesh Hex-dominant by recombination; polycube M6 yes planned
Mesh Smoothing, untangling, boundary padding, layers through thin walls M6 yes planned
Mesh Mesh editing (move, merge, split, collapse, remesh region), imported orphan meshes M6 yes started (node/element add/remove)
Model Sets and surfaces bound to geometry names M3 yes done
Model Materials: elastic (isotropic, orthotropic), density, unit-system check M3 done
Model Materials: plasticity, hyperelasticity, damage, thermal M8 started (von Mises plasticity: bilinear, table, Johnson–Cook; Johnson–Cook damage, erosion; written to Abaqus *PLASTIC, Nastran MATS1, LS-DYNA plastic materials where expressible)
Model Sections: solid, shell, beam profiles; assignment by set M3 done
Model 2D sections: plane stress, plane strain, axisymmetric (XY plane, Y the axis); element edges in sets; centrifugal load M4 done
Model Composite layups, material orientations, continuum shells M8 yes planned
Model Element formulation per region (integration, incompatible modes, hybrid) mapped per solver M3 yes done (model; per-solver mapping with the deck writers)
Model Boundary conditions: fixed, displacement, symmetry M3 done
Model Loads: force and moment, pressure, gravity, body force M3 done
Model Reference points, kinematic and distributing coupling M3 done
Model Steps: linear static, frequency; output presets M3 done
Model Steps: nonlinear static, explicit dynamics, heat transfer; amplitudes M7–M8 planned
Interaction Tie between non-matching meshes M7 planned
Interaction Contact (general and pairs), friction, automatic pair detection M7 planned
Interaction Springs and dashpots (ground or two-point; DOF, vector or line), point masses with rotary inertia M4 done (implicit; explicit translational; all three decks with what each cannot take reported)
Interaction Bolt pretension, connectors M7 planned
Decks Abaqus input writer (deck.write, flat deck; reports what Abaqus cannot express) M3 done
Decks Nastran bulk data writer (deck.write, SOL 101 or 103 per deck; reports what Nastran cannot express) M3 done
Decks LS-DYNA keyword writer (implicit; explicit in M8) M3 done (implicit static and eigenvalue; beam sections planned)
Decks Readers keeping unknown keywords M9 planned
Solve Own linear static and modal solver, verified against analytic solutions M4 yes started (solid elements: tet4, tet10, wedge6, hex8, hex20; 2D plane stress, plane strain and axisymmetric tri3, tri6, quad4 (full, incompatible modes), quad8 (full, reduced); quad4/tri3 MITC shells and Timoshenko beams with profiles, mixed with solids; reference points, kinematic and distributing couplings, moments; centrifugal loads)
Solve Own explicit dynamics solver (central differences, one-point hex8 with hourglass control, nodal-pressure tet4, bulk viscosity, energy balance), verified against analytic wave and impact solutions M10 yes started (X1 core and X2: large deformation, objective rates, J2 and Johnson–Cook plasticity, damage, erosion; contact planned)
Results Deformed shape, contours, mode shapes, probes, reaction sums M4 started (results in the session, solve.probe, reaction sums; display planned)
Results XY and path plots, cuts, display groups, free-body forces, animation M9 planned
Results Readers for public result formats (Nastran OP2, LS-DYNA d3plot, Abaqus .fil) M9 planned
Results Mesh convergence studies M9 planned
App Desktop viewport, model tree, commands, control channel continuous done
App Undo/redo on the command journal, autosave, .modelcraft file M3 done
App MCP server, browser build continuous planned

Deck notes for the writers

  • Node order: the model stores Abaqus/VTK order. Nastran orders the mid-side nodes of 20-node hexes and 15-node wedges differently; LS-DYNA takes tets and wedges as degenerate hexes and triangles as degenerate quads. Every mapping is tested by the sign of the element Jacobian after writing.
  • Each format's field widths, continuation rules, number forms and label limits are respected by the writer and checked by golden-file tests on our own examples.
  • Abaqus: the model's node order and face numbers are Abaqus's, so connectivity passes through; element types come from the element kind, the section and its formulation (table in crates/decks/src/abaqus.rs). The step table is bridged to Abaqus's propagation: zero-valued boundary conditions active in every step go to the initial state, and steps restate their boundary conditions and loads with OP=NEW when the active set changes.
  • Nastran (modelcraft_decks::nastran): entries with a real use large (16-column) fields, the rest small fields; a real is exact when its shortest round-trip form fits 16 columns, else rounded to at least ten significant digits. Linear solids map full integration to PSOLID TWO/THREE + FULL, hex20 reduced to TWO + FULL, hex8 incompatible modes to BUBBLE; one-point reduced linear solids, hybrid solids, reduced-integration or one-point shells, body forces, gravity on part of the model, orthotropic beams and rods, and orthotropic shells off planes of constant Z are reported as unsupported. Static and frequency steps need separate decks (deck.write steps).
  • LS-DYNA (modelcraft_decks::lsdyna, deck.write {"format": "lsdyna"}): long format (20-column fields; every value with up to 13 significant digits, and 17-digit values from 0.01 to 1e17, are written exactly; the rest is rounded to at least 13 digits and counted). The 10-node tetrahedron follows the manual's figure: mid-side nodes 8, 9, 10 on edges 2-4, 3-4, 1-4 (the model has them on 1-4, 2-4, 3-4). Incompatible modes map to ELFORM −18 (eight-point enhanced strain). Several steps are written as *CASE analyses. Refused with the item named: beam sections (not yet), body forces per volume, partial-DOF kinematic couplings, constraints on a coupled reference point, gravity on different sets or on parts of sections, hybrid other than tet4, reduced quadratic elements, materials without density, more than 10 shell integration points.
  • 2D models: Abaqus writes CPS*/CPE*/CAX* (3, 6, 4, 4R, 4I, 8, 8R) with the thickness on the *SOLID SECTION line, edge surfaces S1… and BR/BZ body forces for axisymmetric elements; Nastran writes plane stress as membranes (PSHELL with MID1 only, grids holding 3456 through GRID PS) and edge pressures as consistent FORCEs, and refuses plane strain and axisymmetric elements (their cards differ between Nastran dialects); LS-DYNA writes plane stress and plane strain (unit thickness) as *SECTION_SHELL ELFORM 12/13, one-point quad4 (reduced integration, with hourglass control) and tri3, and refuses quadratic 2D elements, full or incompatible-mode quad4 and axisymmetric sections. Centrifugal loads: Abaqus CENTRIF (ω², point, axis), Nastran RFORCE about an axis through the origin, LS-DYNA not yet.
  • Open item (LS-DYNA tet10 node order): the writer follows the manual's figure (mid-side nodes 8, 9, 10 on edges 2-4, 3-4, 1-4), which disagrees with an earlier reading as the Abaqus order. It needs one confirmation run by a licensed user; agents never run commercial solvers.