Show HN: Jacobi–IDE for Abaqus subroutine with analytical tests and AI diagnosis
Jacobi is an IDE for writing physics simulation subroutines (UMAT, VUMAT, etc.) for Abaqus and other solvers. It runs tests against analytical solutions and uses Claude for AI diagnosis, helping developers get correct constitutive behavior faster.
Jacobi — Abaqus Subroutine IDE
Physics Simulation Subroutines
Jacobi
An IDE for physics simulation subroutines. Write Fortran, C++, or Python, test against closed-form analytical solutions, get an AI diagnosis — built for Abaqus today, designed for the full simulation ecosystem.
Download for Windows
gfortran required
Windows 10 / 11
Open source
✓ AI Completion ✓ Test Marketplace ✓ AI Diagnosis ✓ Hover Docs ✓ Go-to-Definition ✓ 12 Templates ✓ 20 Themes ✓ Static Analysis COMSOL Nastran
jacobi — test runner
$ jacobi run elastic_j2.f
Compiling with gfortran -O2 -Wall...
Running 12 physics tests
✓ A Uniaxial C₁₁₁₁ err: 0.021%
✓ B Lateral C₁₁₂₂ err: 0.008%
✓ C Shear G err: 0.000%
✓ D Bulk K err: 0.031%
✓ E J2 neutrality 20/20 steps
✓ F Yield onset step 8 ✓
✓ G Elastic unload C₁₁₁₁ ok
✗ K Incompressibility 1.2e‑6 > tol
✓ L Yield return err: 0.04%
✓ H Zero increment |dσ|=1e‑14
✗ I DDSDDE FD 3.4% > 1% tol
✓ J DDSDDE symmetry |C-Cᵀ|=8e‑15
10 passed · 2 failed — sending to Claude...
Claude: Plastic flow has volumetric
component. Check NHAT...
$
30+
Physics tests across UMAT, VUMAT, UEL, UHARD, and CREEP subroutine types
8
Bundled community tests in the marketplace — install, run, or author your own
<5s
Full cycle — source to test results to AI diagnosis
20
Editor color themes from Tokyo Night to Rosé Pine to GitHub Dark
Why Jacobi
Subroutine development without the guesswork
Writing a constitutive subroutine means implementing a return-mapping algorithm, assembling a consistent tangent, and satisfying physical constraints the solver never explicitly checks. When a simulation diverges, the error message tells you nothing.
Jacobi runs your subroutine against fifteen closed-form analytical solutions and tells you exactly which one failed and by how much. Then Claude — with full numerical context — explains the physical cause and where in your code to look.
It is not a general-purpose editor. It does one thing: get your subroutine to physically correct behavior faster — across solvers, across languages.
Solver-agnostic from the ground up
Jacobi targets the physics simulation ecosystem, not a single solver. The current release ships deep Abaqus integration. The architecture — subroutine loading, test harness, AI diagnosis, language support — is designed to extend. COMSOL, Nastran, and LS-DYNA integrations are in development.
The long-range goal: run any simulation from within Jacobi using your existing solver license, switching solvers without modifying your subroutine code.
ABAQUS COMSOL NASTRAN LS-DYNA OPENFOAM
Subroutine support
Physics test suite
AI diagnosis
Direct solve — run simulations via your solver license, switch solvers without code changes
Active
In development
Roadmap
Language Fortran C / C++ Python MATLAB
Three steps from source to diagnosis
01
Write your UMAT
Open any .f, .f90, .cpp, or .c file in the Monaco editor. Fortran and C/C++ syntax highlighting, static analysis, AI inline completion, and subroutine detection run automatically. No project setup required.
Monaco + Claude
02
Run the test suite
Click Run Tests. Jacobi compiles a single-element driver, links your subroutine, applies prescribed strain increments across 15 scenarios, and compares each result to its closed-form analytical answer.
gfortran driver
03
Get AI diagnosis
All fifteen numerical results — stresses, strains, errors, pass/fail — are sent to Claude. You get a physics-first explanation of every failure, with the specific variable and equation at fault, plus textbook references.
Claude Haiku
What's in v0.1
Everything you need to ship a correct subroutine
🧪
Test Marketplace
8 bundled community tests for UMAT. Browse, install, run against your open file. Author your own, export as .jtest, share with your team.
📖
Hover Documentation
Hover any Abaqus argument — STRESS, DDSDDE, STATEV — to see its type, dimensions, I/O direction, and a physics description. Fortran intrinsics documented inline too.
🔍
Go-to-Definition
F12 or single-click any variable, parameter, or subroutine to jump to where it's defined. Works within the file with Monaco's full navigation experience.
📄
12 Subroutine Templates
UMAT, VUMAT, UEL, UHARD, CREEP, UMATHT and more — each pre-filled with the full signature, correct IMPLICIT declarations, and inline physics comments.
📐
Calibration & Step Inspector
Fit material parameters to experimental data in the Calibration Panel. Step Inspector shows the full per-increment state — stress, strain, STATEV — after every test run.
📂
.inp & Convergence Tools
Parse Abaqus .inp files to browse steps, materials, and boundary conditions. Import .msg/.dat logs to visualize convergence history.
AI Inline Completion
Ghost text that knows Fortran mechanics
As you type, Jacobi sends the prefix and suffix of your code to Claude. The model is prompted with your subroutine type, fixed vs. free form flag, and surrounding context. What comes back appears as translucent ghost text — Tab to accept.
This isn't token-prediction autocomplete. The model understands that DDSDDE must be symmetric, that NHAT should be deviatoric for J2, and that STATEV indexing is subroutine-specific.
Alt+\ to trigger manually
Don't want ghost text on every keystroke? Trigger on demand. The suggestion appears inline in the editor, no popup, no distraction.
Subroutine-aware context
Jacobi detects which subroutine the cursor is in (UMAT, VUMAT, USDFLD, CREEP) and tells Claude, so completions respect each signature's conventions.
Your key, direct to Anthropic
Enter your Anthropic key once. Every call goes directly from the desktop app to the Anthropic API — no proxy, no telemetry, fractions of a cent per request.
elastic_j2_umat.f AI ●
18C Compute von Mises stress 19 SMISES = SQRT(1.5D0*( 20 & S112+S222+S332 21 & +2.D0*(S122+S132+S232))) 22 IF (SMISES .GT. SYIELD) THEN 23C Return-mapping: radial direction 24 DLAM = (SMISES-SYIELD)/(3.D0*GMOD) 25 DO I=1,3 26 NHAT(I) = S1(I)/(SMISES/1.5D0)▁ 27 STRESS(I) = STRESS(I) - 2.D0*GMOD*DLAM*NHAT(I) 28 END DO
Claude is suggesting… — Tab to accept · Esc to dismiss
AI Diagnosis
Claude reads your test results, not just your code
After the test suite finishes, Jacobi assembles the full numerical context — every stress component, error magnitude, pass/fail flag, and derived quantity — and sends it to Claude Haiku along with your material parameters.
What comes back is a physics-first diagnosis. Not “check line 42” — but “your plastic flow normal has a volumetric component that shouldn’t be there for J2, here’s why, here’s where.”
Continuum mechanics grounding
Diagnoses reference return-mapping algorithms, Voigt notation, isochoric flow, and consistent tangent derivation — not generic debugging advice.
Textbook citations included
Every diagnosis cites the specific chapter: de Souza Neto, Simo & Hughes, Belytschko — so you can go to the source if needed.
Your API key, your data
Add your Anthropic key once in the toolbar. Calls go directly from the app to the Anthropic API — no proxy, no server, fractions of a cent per run.
J
Claude — UMAT Diagnosis ● live
Test results passed to Claude
PASSA — Uniaxial C₁₁₁₁err 0.021%
FAILK — Incompressibility1.2e‑6
FAILI — DDSDDE FD check3.4%
K — Plastic incompressibility failure
J2 plasticity requires isochoric plastic flow: tr(dεp) = 0. Your |εpv| = 1.2e‑6 after yield means the return step is shifting hydrostatic stress.
Most likely cause: STRESS(1)+STRESS(2)+STRESS(3) is modified inside the plastic correction. For J2 the flow normal is purely deviatoric — only shear terms should change.
de Souza Neto, Perić & Owen §8.2.3 • Simo & Hughes §3.6
What gets checked, and how
Each test calls your subroutine directly, applies a prescribed strain increment, and compares the result to the closed-form analytical answer. Tolerances match standard FE solver convergence criteria. All 15 results are fed to Claude for diagnosis.
AUniaxial strain — C₁₁₁₁σ₁₁ = C₁₁₁₁ · ε₁₁Normal stiffnessPASS
BLateral confinement — C₁₁₂₂σ₂₂ = C₁₁₂₂ · ε₁₁Poisson couplingPASS
CSimple shear — Gτ₁₂ = G · γ₁₂Shear modulusPASS
DHydrostatic loading — Kσm = K · εvBulk modulusPASS
EJ2 hydrostatic neutralityσvm = 0 under PNo pressure yieldPASS
FVon Mises yield onsetεy = σy / 2GOnset detectionPASS
GElastic unloading slopedσ/dε|unload = C₁₁₁₁Unload linearityPASS
KPlastic incompressibilitytr(dεp) = 0Isochoric flowFAIL
LYield surface return accuracy|σvm−σy|/σy<1%Return precisionPASS
HZero increment consistency|Δσ| < 1e‑6Null incrementPASS
IDDSDDE finite-difference check|C − dσ/dε| < 1%Tangent accuracyFAIL
JDDSDDE symmetry|Cij−Cji|<1e‑6Matrix symmetryPASS
Track progress run by run
47
Total runs
83%
Pass rate
3
Files tested
Tests passed vs. failed per run (last 8)
run 1
run 2
run 3
run 4
run 5
run 6
run 7
now
Passed
Failed
Recent runs
elastic_j2_umat.f10/12 passed · AI diagnosis: NHAT computation
10 PASS2 FAIL
kinematic_hardening.f9012/12 passed · All tests green
12 PASS
drucker_prager.f7/12 passed · AI diagnosis: cap yield surface
7 PASS5 FAIL
elastic_j2_umat.f11/12 passed · FD tolerance fixed
11 PASS1 FAIL
Code Editor
Write Fortran the way it was meant to be written
Monaco editor — the same engine as VS Code — with full Fortran syntax highlighting, fixed-form and free-form ruler support, and jump-to-error navigation from the test results panel.
Static analysis flags uninitialized variables and undefined symbols inline, before compilation. 20 built-in themes including Tokyo Night, Rosé Pine, Kanagawa, and GitHub Dark.
Fixed & free form
20 themes
Live diagnostics
gfortran squiggles
Subroutine detection
AI ghost text
Hover docs
Go-to-definition
Integrated terminal
elastic_j2_umat.f — Jacobi
1C J2 Isotropic Plasticity UMAT 2 SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,...) 3 IMPLICIT REAL*8 (A-H,O-Z) 4 EMOD = PROPS(1) 5 ANU = PROPS(2) 6 SYIELD = PROPS(3) 7 GMOD = EMOD / (2.D0*(1.D0+ANU)) 8 SMISES = SQRT(1.5D0*(S112+S222+S332 9 & +2.D0*(S122+S132+S232))) 10 IF (SMISES .GT. SYIELD) THEN 11 DLAM = (SMISES-SYIELD) / (3.D0*GMOD) 12 DO I = 1, 3 13 STRESS(I) = STRESS(I) - 2.D0*GMOD*DLAM*NHAT(I) 14 END DO 15 END IF
σvm = 0peak stress
FEM Visualization
Deformation you can see, not just numbers
Uniaxial
Extension with Poisson contraction
Mesh stretches in load direction, contracts laterally at rate ν. Jet colormap tracks σ₁₁ through elastic and plastic regimes.
Shear
Parallelogram distortion
Pure shear without volumetric change. Verifies the G = E/2(1+ν) relationship geometrically.
Hydrostatic
Uniform isotropic compression
Equal strain in all directions. Von Mises stress stays zero — the J2 neutrality test, visualized.
Scrub
Frame-by-frame load history
Drag the step slider to inspect any point in the loading history. Ghost outline marks the original configuration.
Download
Get Jacobi
A single installer. No configuration. Requires gfortran on your PATH for test execution. Add your Anthropic API key in the toolbar to enable AI diagnosis and inline completion.
Download for Windows
v0.1.0 beta · Windows 10/11 x64
Windows may show a SmartScreen warning — click More info → Run anyway.
Install gfortran first: winlibs.com (recommended) or MinGW-w64.
⊞
Windows
Windows 10 / 11 — x86_64 — ~15 MB
↓
macOS
Coming soon
−
☉
Linux
Coming soon
−
Built on Tauri v2. AI features require an Anthropic API key. Questions? Get in touch.
Using Jacobi? We're collecting early feedback to prioritize what to buil
[truncated for AI cost control]