Skip to content

Add AbaqusVUMATTarget backend (vectorized UMAT) #2

Open

Description

@petlenz

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:

  1. For each point, build tmech adapters over the block-major slices.
  2. Call the Layer-2 compute function.
  3. Write the stress and state outputs back.

Acceptance criteria

  • New targets/abaqus_vumat.h with AbaqusVUMATTarget.
  • Smoke test against a recipe with OutputRole::Stress only (skip tangent since VUMAT doesn't use it).
  • Test that backend rejects recipes with OutputRole::ConsistentTangent (or warns and drops it).

Dependencies

Activity

  1. petlenz commented on May 31, 2026

    @petlenz
    MemberAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions