Jacobi Documentation

Feature Reference

Complete reference for every feature in Jacobi — the subroutine IDE built for computational mechanics engineers writing UMAT, VUMAT, UEL, UHARD, and CREEP subroutines for Abaqus.

35Physics tests
5Subroutine types
20Editor themes
AISonnet-powered diagnostics
Overview

What is Jacobi?

Jacobi is a desktop IDE purpose-built for engineers who write Abaqus user subroutines. It replaces the manual edit → compile → submit → wait → inspect loop with an instant single-point RVE test that tells you in seconds whether your constitutive model is physically correct — and exactly which line of Fortran is wrong if it isn't.

Instant physics tests
Run 35 single-point RVE tests against your subroutine in under 3 seconds, without touching Abaqus.
🔬
Subroutine-aware editor
Monaco editor with Fortran syntax, static analysis, live squiggles, and Abaqus argument documentation on hover.
🤖
AI diagnostics
Claude Sonnet reads your test results and points to the exact Fortran variable that's wrong, with a suggested fix citing the canonical textbook.
📐
5 subroutine types
Fully auto-detected. UMAT, VUMAT, UEL, UHARD, and CREEP each get their own test suite and diagnostic logic.
Quickstart

Get running in 60 seconds

Jacobi requires gfortran on your PATH. Everything else is self-contained.

1
Open your subroutine file
Use Ctrl+O or File → Open. Jacobi accepts .f, .f90, .for, and .f95. It immediately detects which Abaqus subroutine type the file contains.
2
Check the Subroutine Panel
The right sidebar shows the detected subroutine (UMAT, VUMAT, etc.) with all arguments listed. Any interface violations are flagged immediately — wrong number of arguments, wrong types, missing IMPLICIT NONE.
3
Open the Tests tab → Run Tests
Click the Tests tab in the bottom panel. Set material parameters (E, ν, σ_y) and click Run Tests. Jacobi compiles your subroutine with gfortran, runs a single-point RVE driver, and parses the results in one shot.
4
Read the results
Each test card shows PASS or FAIL with the measured vs expected value, a chart, the exact lines from your code being tested, and a Testing: banner describing the physics being checked.
5
Click "Analyze with AI" on any failure
Claude Sonnet receives only the failing tests, with measured values and canonical references. It responds with the exact Fortran variable that is wrong and a 4–6 line fix in Fortran 90 syntax.
Prerequisites: gfortran 9+ on your system PATH. On Windows, install via MSYS2. On macOS: brew install gcc. On Linux: apt install gfortran.
Editor

Fortran Editor

Jacobi uses Monaco (the VS Code engine) with a custom Fortran grammar, Abaqus-aware hover documentation, and live diagnostics.

Syntax highlighting

Full tokenization of Fortran 77, 90, and 95 — keywords, intrinsics, strings, comments, preprocessor directives, and numeric literals including REAL*8, D-notation, and complex literals.

Fortran 90 umat_plasticity.f90
!  J2 plasticity UMAT — return-mapping algorithm
SUBROUTINE UMAT(STRESS, STATEV, DDSDDE, SSE, SPD, SCD,
     &           RPL, DDSDDT, DRPLDE, DRPLDT,
     &           STRAN, DSTRAN, TIME, DTIME, TEMP, DTEMP,
     &           PREDEF, DPRED, CMNAME, NDI, NSHR, NTENS,
     &           NSTATV, PROPS, NPROPS, COORDS, DROT,
     &           PNEWDT, CELENT, DFGRD0, DFGRD1,
     &           NOEL, NPT, LAYER, KSPT, KSTEP, KINC)

  IMPLICIT NONE
  INCLUDE 'ABA_PARAM.INC'

  REAL*8 STRESS(NTENS), STATEV(NSTATV), DDSDDE(NTENS,NTENS)
  REAL*8 PROPS(NPROPS), DSTRAN(NTENS)

  !  Material constants from PROPS array
  REAL*8 EMOD, ANU, SYIELD0, HMOD
  EMOD   = PROPS(1)   !  Young's modulus (MPa)
  ANU    = PROPS(2)   !  Poisson's ratio
  SYIELD0 = PROPS(3)  !  Initial yield stress (MPa)
  HMOD   = PROPS(4)   !  Linear hardening modulus (MPa)

Static analysis

Jacobi runs a full static pass on every keystroke. Diagnostics appear as Monaco squiggles and in the Problems panel.

DiagnosticSeverityExample trigger
Undefined variable used before assignmenterrorX = Y + 1 where Y is never assigned
Variable declared but never usedwarnREAL*8 TEMP declared, never referenced
Possible typo — variable not in scopeerrorEMDOD instead of EMOD
Missing IMPLICIT NONEwarnNo IMPLICIT NONE at top of subroutine
UMAT/VUMAT interface argument count mismatcherrorWrong number of arguments in SUBROUTINE line
Variable assigned but value never readwarnDLAM = 0.0 overwritten before use
Click any squiggle to jump to the problem, or press F8 to cycle through all diagnostics. The Problems count in the status bar updates live.
Editor

Themes

20 editor themes — 18 dark, 2 light. Switch instantly via the command palette (Ctrl+Shift+P) and the selection persists across sessions.

Dark+
Monokai
Dracula
One Dark Pro
Nord
GitHub Dark
Tokyo Night
Catppuccin
Rosé Pine
Poimandres
Kanagawa
Night Owl

Switch via Ctrl+Shift+P → type "theme" → select any option. The setting persists across sessions.

Editor

Command Palette

Every action in Jacobi is accessible via the command palette. Press Ctrl+Shift+P anywhere.

Command palette categories
File
  Open File…                   Ctrl+O
  Save File                    Ctrl+S

Build
  Build (compile + run)        F5

View
  Zoom In / Out / Reset        Ctrl++ / Ctrl+- / Ctrl+0

Theme  (20 entries, one per theme)
  Dark+, Monokai, Dracula, One Dark Pro, Nord, GitHub Dark …
Editor

Subroutine Templates

Generate a correctly-structured Fortran scaffold for any Abaqus subroutine type. All arguments, array dimensions, and common patterns pre-filled.

1
Open the Template Dialog
Click the New from Template button in the toolbar, or use the command palette → "New Template".
2
Select subroutine type
Choose UMAT, VUMAT, UEL, UHARD, CREEP, or any other supported Abaqus subroutine. The dialog shows the argument list and description from the Abaqus manual.
3
Insert into editor
The template opens as a new tab with IMPLICIT NONE, all argument declarations typed correctly, and TODO comments at the key implementation sites.
Templates use free-form Fortran 90 (& continuation) regardless of file extension. If you need fixed-form, save with a .f extension and reformat.
Build

Build System

One-key compilation with gfortran. Error messages are parsed and displayed as Monaco squiggles with click-to-jump navigation.

Running a build

Press F5 or click Build in the toolbar. The Build Console opens in the bottom panel showing the raw gfortran output.

Build console output
▶ Building umat_plasticity.f90…
gfortran -O2 -Wall -fcheck=all -o /tmp/jacobi_out umat_plasticity.f90

✓  Compiled successfully  (0.42s)

─── or, on error ───

umat_plasticity.f90:47:18: error: 'DLMA' is not a member of
  DLMA = DLMA + DF / DENOM
                  ^
→ Click to jump to line 47

Error navigation

Every error line in the Build Console is clickable — clicking it moves the cursor to the exact file and line in the editor. The squiggle appears on the offending token, not just the line.

Build

Integrated Terminal

A full PowerShell (Windows) or bash (macOS/Linux) terminal embedded in the bottom panel. Runs in the directory of the active file.

Terminal — example session
PS C:\subs> gfortran --version
GNU Fortran (GCC) 13.2.0

PS C:\subs> gfortran -c umat_plasticity.f90 -o umat.o
(no output = success)

PS C:\subs> nm umat.o | grep umat
0000000000000000 T umat_

Open via the Terminal tab in the bottom panel, or Ctrl+`.

Testing

Single-Point RVE Test Runner

The heart of Jacobi. Each test generates a standalone Fortran program that calls your subroutine with known inputs, then checks the outputs against analytical solutions from the computational mechanics literature.

How it works: Jacobi writes a Fortran driver program, compiles your subroutine together with it using gfortran, runs the binary, and parses tagged output lines. No Abaqus licence required. Total time: <3 seconds.

Configuring material parameters

Before running, set your material constants in the parameter bar at the top of the Tests tab. These values are injected into the Fortran driver's PROPS array.

ParameterDescriptionUsed by
EYoung's modulus (MPa)UMAT, VUMAT, UEL
nuPoisson's ratioUMAT, VUMAT, UEL
syInitial yield stress (MPa). Also used as σ_ref in CREEP testsUMAT, VUMAT, UHARD, CREEP
StepsNumber of strain increments in the sweepAll
dEps/stepStrain increment per step. Also sets DTIME = dEps × 1000 for CREEPAll
Testing → UMAT

UMAT Tests — 15 Physics Checks

Auto-detected when your file contains a SUBROUTINE UMAT signature. Tests cover elastic constants, plasticity, tangent stiffness, and thermodynamic consistency.

Elastic constants

IDTestWhat is testedReference
A Uniaxial stiffness DDSDDE(1,1) · DSTRAN(1) vs analytical C₁₁₁₁ de Souza Neto §4.3.2
B Lateral confinement DDSDDE(1,2) vs C₁₁₂₂ = Eν/((1+ν)(1−2ν)) de Souza Neto §4.3.2
C Shear modulus DDSDDE(4,4) vs G = E/2(1+ν) de Souza Neto §4.3.2
D Bulk modulus Volumetric sum vs K = E/3(1−2ν) de Souza Neto §4.3.1

Plasticity

IDTestWhat is testedReference
EJ2 hydrostatic neutralityHydrostatic compression stays elastic — STRESS components equalde Souza Neto §8.2.1
FVon Mises yield onset√(3J₂) reaches SYIELD at the correct strain stepde Souza Neto §7.2.1
GElastic unloading slopeAfter yielding, unloading slope returns to C₁₁₁₁de Souza Neto §7.3.1
KPlastic incompressibilitytr(dε_p) = dεp₁₁+dεp₂₂+dεp₃₃ ≈ 0 in plastic regimede Souza Neto §8.2.3
LYield surface return accuracyf(σ,q) ≈ 0 after return-mapping — closest-point projectionSimo & Hughes §3.6.1
MFlow direction normalitydεp₂₂/dεp₁₁ → −0.5 (Prandtl-Reuss, J2 associativity)de Souza Neto §8.2.3
NDrucker stabilityσ:dεp ≥ 0 — non-negative plastic dissipationde Souza Neto §6.2
OCyclic / BauschingerCompressive re-yield ≥ 0.9·σ_y0 — hardening sign on reverse loadde Souza Neto §12.2

Tangent stiffness

IDTestWhat is testedReference
HZero increment consistencyDSTRAN=0 → |DSTRESS| < 1e-8 and DDSDDE unchangedde Souza Neto §7.5
IDDSDDE FD checkDDSDDE vs dSTRESS/dDSTRAN via finite difference — consistent tangentde Souza Neto §7.6.1, Simo & Hughes §3.5.3
JDDSDDE symmetryDDSDDE(i,j) = DDSDDE(j,i) — major symmetry of Cde Souza Neto §4.3.2
Test I (DDSDDE) is the most important. Returning the elastic stiffness in the plastic regime (the most common mistake) causes only linear convergence in Abaqus/Standard instead of quadratic. The test catches this immediately.
Testing → VUMAT

VUMAT Tests

For Abaqus/Explicit user material subroutines. VUMAT operates on a block of material points (NBLOCK), uses engineering shear strain (γ/2, not γ), and updates stressNew and enerInternNew in-place.

TestTestingReference
A — Uniaxial elastic modulusstressNew(1) = stressOld(1) + C₁₁₁₁·strainInc(1)de Souza Neto §8.2.1
B — Shear modulus GstressNew(4..6) from strainInc(4..6) — note: engineering shear γ/2de Souza Neto §4.3.2
C — Bulk modulus KMean stress from volumetric strainde Souza Neto §4.3.1
D — Elastic unloading slopeSlope of stressNew(1) during unloading after plastic loading = ELubliner §4.3
Energy — 2nd lawenerInternNew(k)enerInternOld(k) every incrementde Souza Neto §6.1
Testing → UEL

UEL Tests

Tests a 4-node plane-strain element (NDOFEL=8) with 2×2 Gauss integration. The three classical element validation tests from the FEM literature.

TestTestingReference
A — AMATRX symmetrymax|AMATRX(i,j) − AMATRX(j,i)| < 1e-10Cook, Malkus & Plesha §3.5
B — Rigid body null spacemax|RHS| < 1e-6 under unit rigid-body translation (K·u_rigid = 0)Bathe (1996) §4.3
C — Patch testElement reproduces constant strain field exactly — completeness checkIrons & Razzaque (1972)
D — Positive diagonalsmin(AMATRX(i,i)) > 0 — necessary for positive definitenessCook §2.4
Testing → UHARD

UHARD Tests

Tests the isotropic hardening law. UHARD must return SYIELD (current yield stress) and HARD(1) (dσ_y/dε̄_p, the tangent hardening modulus used in the return-mapping denominator).

TestTestingReference
A — Initial yieldSYIELD at EQPLAS=0 equals σ_y0 from material parametersAbaqus Manual §26.2.1
B — MonotonicitySYIELD non-decreasing across all steps (Drucker stability)Lubliner §5.3
C — HARD(1) FD consistencyHARD(1) vs central-difference (SYIELD(ε+δ)−SYIELD(ε−δ))/2δSimo & Hughes §3.5.2
Testing → CREEP

CREEP Tests

Tests against a Norton-Bailey power law (Δε_cr = A·σ̄ⁿ·DTIME). The driver sets A=1e-10, n=3, and uses σ_ref from the material parameter bar.

TestTestingReference
A — Non-negativityDECRA(1) ≥ 0 for any QTILD ≥ 0Lemaitre & Chaboche §6.1.1
B — Norton-Bailey accuracyDECRA(1) vs A·QTILD^n·DTIME — relative error < 0.01%Abaqus Benchmark §3.2.6
C — Rate sensitivityDECRA(1) at 2σ / DECRA(1) at σ = 2^n exactlyBailey (1935)
D — Zero stressDECRA(1) = 0 when QTILD = 0Norton (1929)
Fortran 90 creep_power_law.f — example passing all 4 tests
SUBROUTINE CREEP(DECRA, DESWA, STATEV, SERD, EC, ESW, P, QTILD,
     &             TEMP, DTEMP, PREDEF, DPRED, TIME, DTIME, ...)
  IMPLICIT REAL*8(A-H,O-Z)

  A_CR = PROPS(1)   !  Coefficient A
  N_CR = PROPS(2)   !  Stress exponent n

  IF (QTILD .LE. 0.0D0) THEN
    DECRA(1) = 0.0D0   !  Test D: zero stress → zero creep
    DECRA(5) = 0.0D0
    RETURN
  END IF

  !  Norton-Bailey: Δε_cr = A * σ_bar^n * DTIME
  DECRA(1) = A_CR * QTILD**N_CR * DTIME
  DECRA(5) = A_CR * N_CR * QTILD**(N_CR - 1.0D0) * DTIME

END SUBROUTINE
Testing

Test History

Every test run is automatically saved with its material parameters, pass/fail results, and AI analysis text. Browse previous runs via the History tab.

Use Export Test Report in the AI Analysis section to generate a self-contained HTML report you can share with a colleague or attach to a paper submission. The report includes all charts, test results, and the AI diagnostic text.

AI

AI Diagnostics
Claude Sonnet

After running tests, click Analyze with AI. Jacobi sends only the failing tests to Claude Sonnet — with measured values, expected values, and canonical textbook references embedded — and receives a structured per-failure diagnosis.

What the AI receives

The prompt is built dynamically from your actual results. If 3 of 15 UMAT tests fail, the AI sees only those 3, each with:

  • The test name and its canonical reference (e.g. de Souza Neto §7.6.1 eq 7.7.5)
  • Your measured value vs the expected value
  • The suspect Fortran variable name (e.g. DDSDDE(1,1))

What the AI returns

For each failing test, the response is structured in three parts:

Example AI response — Test I fails (DDSDDE tangent)
## Test I — DDSDDE finite-difference check

Physical meaning:
  Your DDSDDE is the elastic stiffness C_e in all cases. In the plastic regime,
  Abaqus/Standard uses DDSDDE to form the global stiffness matrix. Returning C_e
  instead of the algorithmic consistent tangent C_ep causes only linear convergence
  instead of quadratic — your jobs will take 5-10× more iterations to converge.
  Reference: de Souza Neto §7.6.1, Simo & Hughes (1998) §3.5.3.

Most likely variable:
  DDSDDE(I,J) in your plastic branch. You are probably assigning the elastic
  values and not applying the plastic correction:
    C_ep = C_e - (C_e:n ⊗ n:C_e) / (H + n:C_e:n)

Suggested fix:
!  After computing DLAM and the flow direction RNORM, add:
  FACN = 1.0D0 / (HMOD + 3.0D0*GMOD)
  DO I = 1, NTENS
    DO J = 1, NTENS
      DDSDDE(I,J) = DDSDDE(I,J) - 2.0D0*GMOD*2.0D0*GMOD * FACN
     &                        * DEVS(I) * DEVS(J) / SMISES**2
    END DO
  END DO
API key required. Add your Anthropic API key via the key icon in the toolbar. The key is stored locally and never sent to any server other than api.anthropic.com.
AI

AI Code Completion
Copilot-style

Ghost-text completions appear as you type in the editor, trained on Fortran patterns and Abaqus UMAT conventions. Press Tab to accept.

Example — typing starts a return mapping, AI completes
!  You type:
  SMISES = SQRT(1.5D0*

!  AI suggests (ghost text in grey):
  SMISES = SQRT(1.5D0*DOT_PRODUCT(DEVS,DEVS))

Completions are context-aware — they read the current subroutine type, declared variables, and surrounding code before generating.

Tools

Calibration Panel

Fit material parameters (E, ν, σ_y, H) to experimental data using least-squares optimisation. Paste stress-strain CSV data and the panel solves for the best-fit PROPS values.

1
Open the Calibration tab
Click Calibration in the bottom panel tabs.
2
Paste experimental data
Two-column CSV: strain (ε₁₁) in column 1, stress (σ₁₁, MPa) in column 2. The panel plots the data immediately.
3
Run calibration
Jacobi minimises ‖σ_UMAT(ε) − σ_exp(ε)‖ by varying the selected parameters. Results are shown alongside the experimental curve.
4
Copy to Tests
Click Apply to Tests to push the calibrated values into the Test Runner parameter bar, then rerun tests to verify the fitted model.
Tools

Step Inspector

Full per-increment state viewer. Shows every STRESS, STATEV, DDSDDE, DSTRAN, and STRAN value at every increment of the last test run. Useful for tracking down subtle integration errors that summary pass/fail metrics miss.

Step Inspector — increment 12 (plastic regime)
Step 12   EQPLAS = 0.0120   Phase: plastic

STRESS   [ 312.4  -156.2  -156.2   0.0   0.0   0.0 ]  MPa
DSTRAN   [ 1.00e-4  -4.30e-5  -4.30e-5  0  0  0 ]
STATEV   [ 0.0120  312.4  0.0  … ]
         (EQPLAS)  (SYIELD)

DDSDDE (6×6):
  221.4   110.7   110.7    0    0    0
  110.7   221.4   110.7    0    0    0
  ...
  ← plastic tangent, not elastic (C_ep ≠ C_e) ✓
Tools

STATEV Manager

Documents your solution-dependent state variables. Map each STATEV(i) slot to a name, unit, and description. The mapping is saved with the project and shown in the Step Inspector.

STATEV mapping — J2 plasticity example
STATEV(1)  EQPLAS   Equivalent plastic strain          [—]
STATEV(2)  SYIELD   Current yield stress               [MPa]
STATEV(3)  ALPHA1   Backstress component 11            [MPa]
STATEV(4)  ALPHA2   Backstress component 22            [MPa]
STATEV(5)  ALPHA3   Backstress component 33            [MPa]
STATEV(6)  ALPHA4   Backstress component 12            [MPa]
Tools

Hardening Curve Editor

Visual editor for piecewise-linear hardening data. Plot your σ_y vs ε̄_p table, interpolate, and export directly as Fortran DATA statements or as Abaqus *PLASTIC keyword input.

Tools

.inp File Viewer

Parse and display Abaqus .inp files — nodes, elements, sections, boundary conditions, steps, and material blocks. Useful for checking that the UMAT is being called with the correct PROPS, NSTATV, and NTENS values.

Tools

Convergence Log

Parses Abaqus .msg and .dat files to visualise Newton iteration counts, residual norms, and cutbacks. Helps correlate test failures (especially DDSDDE) with real-simulation convergence behaviour.

Reference

Subroutine Reference

All Abaqus subroutine types recognised by Jacobi. Hover any subroutine name in the editor to see its full argument list and description.

Abaqus/Standard

UMAT
UMATHT
UEL
UELMAT
UHARD
CREEP
DLOAD
DFLUX
UFIELD
USDFLD
URDFIL
UEXTERNALDB
UTRS
UEXPAN

Abaqus/Explicit

VUMAT
VUMATHT
VUEL
VDLOAD
VDFLUX
VDISP
VEXTERNALDB
Reference

Keyboard Shortcuts

File & Editor

Open File
CtrlO
Save File
CtrlS
Command Palette
CtrlShiftP
Zoom In / Out / Reset
Ctrl+ Ctrl- Ctrl0
Next diagnostic squiggle
F8

Build & Test

Build (compile + run)
F5
Open Terminal
Ctrl`

Editor (Monaco standard)

Find / Replace
CtrlF CtrlH
Go to Line
CtrlG
Toggle comment
Ctrl/
Select all occurrences
CtrlShiftL
Format (indent)
ShiftAltF
Reference

Export & Reports

After running tests and clicking Analyze with AI, use Export Test Report to generate a self-contained HTML document containing:

  • Material parameters used
  • All 35 test results with pass/fail and measured values
  • Charts for every test with a numeric output
  • The full AI diagnostic text, including suggested Fortran fixes
  • Literature references for each test

The HTML file is fully self-contained (no external dependencies) and can be attached to a paper, sent to a reviewer, or archived alongside the subroutine source.