Repository navigation
Add AbaqusVUMATTarget backend (vectorized UMAT) #2
Copy link
Copy link
Open
Description
Goal
Generate an Abaqus VUMAT user subroutine. VUMAT is the explicit-dynamics, vectorized counterpart to UMAT — it operates on blocks of integration points at once, which makes it the standard target for high-throughput explicit Abaqus models.
Depends on #1 (AbaqusUMATTarget) — most of the Voigt + Abaqus convention machinery is shared.
VUMAT signature
extern "C" void vumat_(
int *nblock, // number of points in the block
int *ndir, int *nshr, int *nstatev, int *nfieldv, int *nprops,
int *lanneal,
double *stepTime, double *totalTime, double *dt,
char *cmname, int cmname_len,
double *coordMp,
double *charLength,
double *props, // (nprops)
double *density, // (nblock)
double *strainInc, // (nblock, ndir+nshr)
double *relSpinInc, // (nblock, nshr)
double *tempOld,
double *stretchOld, // (nblock, ndir+nshr)
double *defgradOld, // (nblock, ndir+2*nshr) — note: 9 components in 3D
double *fieldOld,
double *stressOld, // (nblock, ndir+nshr) — stress at start of step
double *stateOld, // (nblock, nstatev)
double *enerInternOld, double *enerInelasOld,
double *tempNew, double *fieldNew,
double *stressNew, // out: (nblock, ndir+nshr)
double *stateNew, // out: (nblock, nstatev)
double *enerInternNew, double *enerInelasNew);Block-major layout: stressNew[i * NTENS + k] where i is the point index and k is the component.
Differences from UMAT
| Aspect | UMAT | VUMAT |
|---|---|---|
| Iteration scope | per-point | per-block (vectorized) |
Tangent (DDSDDE) |
required | not used (explicit time integration) |
| Stress sign | total Cauchy | total Cauchy |
| Strain measure | total strain + increment | strain increment only |
| State variables | one-shot in/out | stateOld → stateNew |
The big win for VUMAT: no consistent tangent to generate. The codegen only needs to emit stress + history evolution.
What to emit
A .cpp file with the extern \"C\" VUMAT entry and a loop over nblock points that:
- For each point, build tmech adapters over the block-major slices.
- Call the Layer-2 compute function.
- Write the stress and state outputs back.
Acceptance criteria
- New
targets/abaqus_vumat.hwithAbaqusVUMATTarget. - Smoke test against a recipe with
OutputRole::Stressonly (skip tangent since VUMAT doesn't use it). - Test that backend rejects recipes with
OutputRole::ConsistentTangent(or warns and drops it).
Dependencies
- Add AbaqusUMATTarget backend #1 must land first (shares the Voigt machinery).
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
petlenz commentedon May 31, 2026
Tracked as Phase 6 of the NumSim compiler epic #28. This issue is the concrete deliverable for Phase 6.1; it unblocks once Phase 3b (#35) lands the algorithmic-tangent pass that DDSDDE needs.