Workflow
Every Ferro solve follows the same physics regardless of which surface you drive
it from: assemble the global stiffness matrix, apply boundary conditions, solve
K·u = f, then recover stress and strain from the displacement field. What
differs is how you get there.
Via Prism
Opening a .ferro/ directory bundle in Prism loads it into a dedicated view with:
- A 3D viewport for the mesh and results
- A JSON editor for the underlying analysis configuration
- Results overlays (stress, displacement, etc.) once a solve completes
This is the fastest path for interactive work — building up a Case, adding Environments, and iterating on loads/supports visually.
Via ferro-cli
Build the CLI from the physics/ workspace:
cd physics
cargo build -p ferro-cli --releaseIts subcommands:
| Subcommand | Purpose |
|---|---|
run | Solve a workspace (request JSON + mesh) and persist outputs |
post | Re-run post-processing on existing results, without re-solving |
validate | Check a request JSON is well-formed, optionally against a mesh to validate named sets |
mesh-summary | Print a summary of a mesh file |
schema | Print the JSON schema for a FerroRequest |
This is the path for scripting solves in CI or batch-processing a sweep of configurations without opening Prism.
Via ferro-py
The Python bindings (import ferro) expose the same solve pipeline as a
scriptable API. The typical shape:
import ferro
mesh = ferro.read_gmsh("part.msh")
fixed_nodes = ferro.select_nodes(mesh, ...)
material = ferro.LinearElastic.steel()
result = ferro.solve(mesh, material, fixed_nodes, ...)
stress = ferro.compute_von_mises_stress(result)
ferro.write_vtk(result, "out.vtu")This is the path for embedding Ferro in a larger Python pipeline — parametric studies, custom post-processing, or gluing it to other tools.
All three surfaces converge on the same ferro-config::FerroRequest
type. A request built by hand in Python and one exported from a Prism Case
will solve identically — there's no behavioral difference between the
interactive and scripted paths.
Next
See File Formats for what each of these commands actually reads and writes.