forked from 1b-agent/fieldcraft-upstream
ModelCraft foundation: workspace, quality gates, FE model, command engine, geometry boundary
A pure-Rust CAE modeling workspace following the SolidCraft conventions: - modelcraft-model: nodes and elements by label with hostile-input validation - modelcraft-geometry: SolidCraft's kernel (pinned git dependency) behind our own API; tessellation into a face-tagged boundary surface for volume meshing - modelcraft-engine: CommandSpec registry, Session::execute with rollback and panic guard, scripts and a journal - modelcraft-cli: list commands, run scripts - xtask: layers (only geometry may use solidcraft-*), assets, licences, tests, wasm, ci - AGENTS.md, architecture, ADR 0001 (libraries and licences), roadmap, CI Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm
This commit is contained in:
commit
b64ec3f698
38 files changed
+3931
No files matched your search
@@ -0,0 +1,52 @@
|
||||
# ADR 0001: Libraries and licences
|
||||
|
||||
Status: accepted (2026-10-13)
|
||||
|
||||
## Context
|
||||
|
||||
ModelCraft is MIT OR Apache-2.0. Everything it links must allow that, and the meshing and solver
|
||||
algorithms, where the obvious open-source implementations are GPL-family, must come from papers.
|
||||
|
||||
## Decision
|
||||
|
||||
**Geometry: SolidCraft's kernel**, as a git dependency pinned by rev
|
||||
(`solidcraft-kernel`, `solidcraft-geom`; MIT OR Apache-2.0, built on the Apache-2.0 truck
|
||||
crates). ModelCraft uses its B-rep bodies and its tessellation; it does not read CAD exchange
|
||||
files itself. Only `modelcraft-geometry` may depend on it.
|
||||
|
||||
**Meshing: our own**, implemented from published papers (`docs/meshing/literature.md`).
|
||||
Robust predicates follow Shewchuk's adaptive-precision arithmetic (the paper; his reference
|
||||
`predicates.c` is public domain). A permissive crate may be adopted instead after review; record
|
||||
it here.
|
||||
|
||||
**Linear algebra:** to be decided in the solver task, among permissively licensed pure-Rust
|
||||
crates (for example `faer`, MIT). Record the choice here.
|
||||
|
||||
**Allowed:** MIT, BSD-2/3, Apache-2.0, ISC, Zlib, Unicode, MPL-2.0 (as an unmodified dependency),
|
||||
CC0 and public domain.
|
||||
|
||||
**Rejected — never read, copy or link:**
|
||||
|
||||
| Project | Licence | Would have offered |
|
||||
|---|---|---|
|
||||
| TetGen | AGPL-3.0 | constrained Delaunay tetrahedralization |
|
||||
| CGAL | GPL-3.0 / LGPL-3.0 | Delaunay, mesh generation |
|
||||
| Gmsh | GPL-2.0+ | tet and hex meshing |
|
||||
| Netgen | LGPL-2.1 | tet meshing |
|
||||
| CalculiX | GPL-2.0 | implicit solver, Abaqus-like input |
|
||||
| Code_Aster | GPL-3.0 | implicit solver |
|
||||
| OpenRadioss | AGPL-3.0 | explicit solver |
|
||||
| Elmer | GPL-2.0 / LGPL-2.1 | multiphysics solver |
|
||||
| deal.II, FreeFEM, Salome | LGPL | FE libraries, pre-processing |
|
||||
| OpenCASCADE | LGPL-2.1 | B-rep kernel |
|
||||
|
||||
**Commercial products** (Abaqus, Nastran, LS-DYNA, LS-PrePost, HyperMesh, ANSA, Femap, Patran,
|
||||
ANSYS) are never run, scripted or used as a source of data. Deck formats come from the vendors'
|
||||
public reference manuals, described in our own words with our own examples.
|
||||
|
||||
## Consequences
|
||||
|
||||
- The tet and hex meshers are significant original work; the literature survey decides the
|
||||
order and the methods.
|
||||
- SolidCraft and ModelCraft move together: bumping the pinned rev bumps the repeated
|
||||
`[patch.crates-io]` entries in the same commit.
|
||||
@@ -0,0 +1,60 @@
|
||||
# Architecture
|
||||
|
||||
ModelCraft turns geometry into finite element models, writes them for the solvers engineers
|
||||
already use, and solves linear problems itself.
|
||||
|
||||
```
|
||||
SolidCraft B-rep ──tessellate──▶ boundary surface ──▶ volume mesh ──▶ FE model ──▶ Abaqus .inp
|
||||
(solidcraft-kernel) (welded, watertight, tet (Delaunay) materials, Nastran .bdf
|
||||
face-tagged) hex (core goal) sections, LS-DYNA .k
|
||||
BCs, loads, ──▶ own linear
|
||||
steps solver
|
||||
```
|
||||
|
||||
## Crates and layers
|
||||
|
||||
`cargo xtask layers` enforces the table in `xtask/src/layers.rs`: a crate may depend only on
|
||||
crates in strictly lower layers.
|
||||
|
||||
| Layer | Crate | Role | Status |
|
||||
|---|---|---|---|
|
||||
| L0 | `modelcraft-model` | Solver-neutral FE model: nodes, elements by label; materials, sections, sets, BCs, loads and steps as they land. Knows no file format. | started |
|
||||
| L1 | `modelcraft-geometry` | The only door to SolidCraft: B-rep bodies, measures, tessellation into a face-tagged `SurfaceMesh`. No SolidCraft type in its API. | started |
|
||||
| L1 | `modelcraft-mesh` | Surface preparation (weld, watertightness, feature edges), robust predicates, Delaunay tetrahedralization and refinement, Voronoi-based optimization, hex meshing, quality metrics. | planned |
|
||||
| L1 | `modelcraft-solver` | Element formulations, assembly, sparse linear static and modal solution. | planned |
|
||||
| L1 | `modelcraft-decks` | Abaqus input, Nastran bulk data and LS-DYNA keyword readers and writers, to and from `model`. | planned |
|
||||
| L1 | `modelcraft-render` | Display data (meshes, contour maps) without a GPU dependency. | planned |
|
||||
| L2 | `modelcraft-doc` | The document: geometry, mesh, model, results, history. | planned |
|
||||
| L3 | `modelcraft-io` | `.modelcraft` files, result files. | planned |
|
||||
| L4 | `modelcraft-engine` | Commands (`CommandSpec`), `Session::execute` with rollback and the panic guard, scripts. | started |
|
||||
| L5 | `modelcraft-ui-egui`, `modelcraft-mcp` | Desktop UI, control channel and MCP server. | planned |
|
||||
| apps | `modelcraft`, `modelcraft-cli`, `modelcraft-web` | Desktop, command line, browser. | cli started |
|
||||
|
||||
Rules beyond the layer order:
|
||||
- Nothing below L5 uses egui, eframe, winit, wgpu or rfd.
|
||||
- Only `modelcraft-geometry` uses `solidcraft-*`, pinned by rev in the workspace `Cargo.toml`.
|
||||
SolidCraft's `[patch.crates-io]` (its fixed truck crates) does not reach dependents, so the
|
||||
workspace repeats it from the same rev; bump both together.
|
||||
- Everything below the apps builds for `wasm32-unknown-unknown`.
|
||||
|
||||
## Meshing pipeline
|
||||
|
||||
1. **Boundary surface.** SolidCraft tessellates each body; every triangle carries its B-rep face,
|
||||
so feature edges and face-based loads and BCs survive meshing.
|
||||
2. **Surface preparation.** Weld coincident vertices, check the surface is closed, manifold and
|
||||
consistently oriented, find feature edges (face boundaries, sharp dihedral angles).
|
||||
3. **Tetrahedral meshing.** 3D Delaunay tetrahedralization of the boundary points with exact
|
||||
predicates, boundary recovery, Delaunay refinement to a size field, then Voronoi-based
|
||||
optimization (centroidal Voronoi / optimal Delaunay) and sliver removal.
|
||||
4. **Hexahedral meshing (the core).** All-hex first where it can be guaranteed valid, with
|
||||
hex-dominant as the fallback; the method is chosen from the literature survey
|
||||
(`docs/meshing/literature.md`).
|
||||
5. **Quality.** Scaled Jacobian, aspect ratio, dihedral angles; every generated mesh is checked
|
||||
for positive Jacobians and conserved volume before it reaches the model.
|
||||
|
||||
## Commands
|
||||
|
||||
Every user-visible action is a `CommandSpec` in `crates/engine/src/cmd/<area>.rs` with a JSON
|
||||
form. `Session::execute` clones the model, runs the command under `catch_unwind`, and restores
|
||||
the model on an error or a panic; commands that changed the model are journalled, so the
|
||||
journal replays as a script.
|
||||
Reference in new issue
Block a user