# Abaqus User Subroutines Research Brief ## Metadata - feature_id: abaqus-user-subroutines - source_requirement: N/A - status: draft - owner_agent: research-agent - date: 2026-06-08 ## Research Questions - Abaqus User Subroutine은 어떤 해석 기능을 확장하며, Standard와 Explicit에서 어떤 subroutine family로 나뉘는가? - User subroutine 개발 시 고정해야 할 ABI, include, 입력 파일, 상태변수, debug, compile/link 계약은 무엇인가? - UMAT, VUMAT, UEL, VUEL, USDFLD/VUSDFLD, UVARM, UEXTERNALDB/VEXTERNALDB 중 FESA harness에 우선 반영해야 할 개발/검증 패턴은 무엇인가? - 현재 C++/MSVC/CMake/CTest 중심 harness를 Abaqus user subroutine 개발에 맞추려면 어떤 gate와 artifact 계약이 필요해지는가? ## Source Inventory | source_type | title | author_or_org | URL_or_DOI | access_date | reliability_tier | notes | | --- | --- | --- | --- | --- | --- | --- | | vendor manual mirror | Abaqus Analysis User's Guide 18.1.1, User subroutines: overview | Dassault Systemes SIMULIA, mirrored by University of Colorado | https://ceae-server.colorado.edu/v2016/books/usb/pt04ch18s01aus106.html | 2026-06-08 | Tier 1, version-specific mirror | Core lifecycle, include, execution, debugging, state variable, vectorization, parallelization rules. | | vendor manual mirror | Abaqus User Subroutines Reference Guide A.1, User subroutines index | Dassault Systemes SIMULIA, mirrored by University of Colorado | https://ceae-server.colorado.edu/v2016/books/sub/ap01s01.html | 2026-06-08 | Tier 1, version-specific mirror | Categorizes Standard, Explicit, CFD user subroutines by function. | | vendor manual mirror | Abaqus User Subroutines Reference Guide A.2, User subroutine functions listing | Dassault Systemes SIMULIA, mirrored by University of Colorado | https://ceae-server.colorado.edu/v2016/books/sub/ap01s02.html | 2026-06-08 | Tier 1, version-specific mirror | Defines one-line purpose for each user subroutine. | | vendor manual mirror | Abaqus Analysis User's Guide 26.7.1, User-defined mechanical material behavior | Dassault Systemes SIMULIA, mirrored by University of Colorado | https://ceae-server.colorado.edu/v2016/books/usb/pt05ch26s07abm69.html | 2026-06-08 | Tier 1, version-specific mirror | UMAT/VUMAT material behavior, stress/strain conventions, material constants, state variables, deletion, hourglass/shear caveats. | | vendor manual mirror | Abaqus User Subroutines Reference Guide 1.1.44, UMAT | Dassault Systemes SIMULIA, mirrored by University of Colorado | https://ceae-server.colorado.edu/v2016/books/sub/ch01s01asb44.html | 2026-06-08 | Tier 1, version-specific mirror | Standard user material interface; source page had slow/scripted HTML but search/open snippets exposed key warnings and variables. | | vendor manual mirror | Abaqus User Subroutines Reference Guide 1.2.22, VUMAT | Dassault Systemes SIMULIA, mirrored by University of Colorado | https://ceae-server.colorado.edu/v2016/books/sub/ch01s02asb22.html | 2026-06-08 | Tier 1, version-specific mirror | Explicit vectorized user material interface. | | vendor manual mirror | Abaqus User Subroutines Reference Guide 1.1.28, UEL | Dassault Systemes SIMULIA, mirrored by University of Colorado | https://ceae-server.colorado.edu/v2016/books/sub/ch01s01asb28.html | 2026-06-08 | Tier 1, version-specific mirror | Standard user element interface and LFLAGS procedure contract. | | vendor manual mirror | Abaqus Analysis User's Guide 3.2.18, Making user-defined executables and subroutines | Dassault Systemes SIMULIA, mirrored by University of Colorado | https://ceae-server.colorado.edu/v2016/books/usb/pt01ch03s02abx18.html | 2026-06-08 | Tier 1, version-specific mirror | `abaqus make`, compile/link environment parameters, shared library deployment. | | vendor manual mirror | Abaqus User Subroutines Reference Guide 2.1.15, Terminating an analysis | Dassault Systemes SIMULIA, mirrored by University of Colorado | https://ceae-server.colorado.edu/v2016/books/sub/ch02s01abu15.html | 2026-06-08 | Tier 1, version-specific mirror | `XIT` and `XPLB_EXIT` instead of Fortran `STOP`. | | vendor manual mirror | Abaqus User Subroutines Reference Guide 2.1.22, Ensuring thread safety | Dassault Systemes SIMULIA, mirrored by University of Colorado | https://ceae-server.colorado.edu/v2016/books/sub/ch02s01abu22.html | 2026-06-08 | Tier 1, version-specific mirror | Mutex/thread-safety guidance for common blocks, files, and shared resources. | | vendor manual mirror | Abaqus User Subroutines Reference Guide 2.1.23, Allocatable arrays | Dassault Systemes SIMULIA, mirrored by University of Colorado | https://ceae-server.colorado.edu/v2016/books/sub/ch02s01abu23.html | 2026-06-08 | Tier 1, version-specific mirror | Thread-local/global arrays as safer alternatives to common blocks and save variables. | | public code repository | davidmorinNTNU/ABAQUS_subroutines | David Morin, NTNU | https://github.com/davidmorinNTNU/ABAQUS_subroutines | 2026-06-08 | Tier 3 example repository | Fortran examples for UVARM, USDFLD/VUSDFLD, UHARD/VUHARD, UMAT/VUMAT, UEXTERNALDB/VEXTERNALDB. README states examples were checked in Abaqus 2019 double precision with Intel ifort 16.0.8 but are not guaranteed bug-free or validated. | ## Extracted Facts ### Scope and execution model - Abaqus user subroutines extend features where normal data input is too restrictive. They can be written in C, C++, or Fortran and are supplied at analysis execution time with `abaqus job=job-name user={source-file | object-file}` or through Abaqus/CAE's user subroutine file field. - User subroutines are not saved to restart files. A restarted run must include the subroutine again and may include a revised one. - User subroutines cannot call one another directly. They can call Abaqus-provided utility routines where supported. - Fortran user subroutines must include `aba_param.inc` for Standard or `vaba_param.inc` for Explicit as the first statement after the argument list. C/C++ user subroutines must include `aba_for_c.h`, use Abaqus Fortran-callable naming conventions, and pass arguments by reference. - User code must only define variables listed by the subroutine documentation as variables to be defined. Rewriting information-only variables has unpredictable effects. - The command `abaqus make` can build user postprocessing executables and user subroutine object/shared libraries. The relevant environment parameters include `compile_cpp`, `compile_fortran`, `link_exe`, and `link_sl`. Prebuilt user subroutine shared libraries can be found through `usub_lib_dir`. ### Development and debugging constraints - Abaqus recommends thorough testing on small examples before production use. The manual specifically emphasizes small models where the user subroutine is the only complicated part. - Debug output can be written to Abaqus-owned units: Standard `.msg` through unit 7, Standard `.dat` or Explicit `.log` through unit 6. Those units must not be opened by user code. Other user files should use allowed unit ranges and full paths because Abaqus uses scratch directories. - `ABA_PARALLEL_DEBUG` can increase verbosity and expose compile/link/debug information. - Use `XIT` in Standard and `XPLB_EXIT` in Explicit instead of `STOP` so Abaqus closes analysis files properly. - Large arrays should not live on the stack. Native allocatable arrays or Abaqus allocatable-array utilities should be used for large or persistent data. - Parallel jobs are allowed, but common blocks, common files, global arrays, and shared resources must be guarded for thread safety. Abaqus provides mutex utilities and local/global allocatable array utilities. ### Model identity and data conventions - Coordinates passed to user subroutines are generally global assembly coordinates unless a specific interface says otherwise. - Node and element numbers passed into user subroutines are Abaqus internal global numbers. `GETPARTINFO`/`VGETPARTINFO` and `GETINTERNAL`/`VGETINTERNAL` are available when original part instance names and local numbers are needed, but their use is not free. - Set and surface names passed into user subroutines are uppercase and, for assemblies, prefixed by assembly and part instance names. - Solution-dependent state variables are allocated differently depending on the subroutine family. Common material subroutines usually use `*DEPVAR`; UEL uses `*USER ELEMENT, VARIABLES=...`; contact/interface subroutines use their own option-specific `DEPVAR` contracts. - State variable output is available through `SDV`/`SDVn` for supported material/integration-point cases. ### Standard vs Explicit API shape - Abaqus/Standard subroutines are generally scalar per material point, element, node, or contact point. Standard material/element/interface subroutines are often called twice in the first iteration of an increment to form initial stiffness and once in later iterations, with extra calls in some dynamic procedures. - Abaqus/Explicit subroutines use a vector interface: blocks of data for `nblock` material points are passed to routines such as VUMAT. `vaba_param.inc` defines `maxblk` for dimensioning temporary arrays. - Abaqus/Explicit has single and double precision executables. The precision is determined by the executable and `vaba_param.inc`; user code should follow Abaqus precision conventions instead of hard-coding incompatible types. ### UMAT and VUMAT - User-defined mechanical behavior is implemented through UMAT for Abaqus/Standard and VUMAT for Abaqus/Explicit. This interface allows arbitrary mechanical constitutive models but is explicitly not a routine exercise. - UMAT and VUMAT operate on Cauchy stress components. VUMAT quantities are expressed in a corotational coordinate system at the material point, and Abaqus uses the Green-Naghdi stress rate in VUMAT; built-in Explicit materials may use different objective stress rates. - Mechanical material constants are supplied through `*USER MATERIAL`. Abaqus/Explicit also requires `*DENSITY`. - In Standard, UMAT must return updated stress, updated state variables, and the material Jacobian `DDSDDE`. The Jacobian strongly controls Newton convergence and computational efficiency. If the Jacobian is nonsymmetric, `UNSYMM` should be requested. - In Explicit, VUMAT receives blocks of points and must return `stressNew` and `stateNew`; it can also update internal and inelastic energy arrays. - Element deletion can be controlled by a state variable with `*DEPVAR, DELETE=...`; deleted material points carry no stress and cannot be reactivated. - For reduced-integration, beam, shell, and transverse-shear cases, user material behavior may require explicit hourglass or transverse shear stiffness choices because Abaqus may not be able to infer them from user material data. - Hybrid element behavior with UMAT has special total/incremental/incompressible formulations. Nearly incompressible hyperelastic user materials can converge poorly if the wrong hybrid formulation is used. ### UEL and VUEL - UEL defines an Abaqus/Standard user element. The core interface includes `RHS`, `AMATRX`, `SVARS`, `ENERGY`, element-level DOF counts, properties, coordinates, displacements, velocities/accelerations as relevant, time, step/increment, and flags. - `LFLAGS` drives what the UEL must compute. For normal implicit time incrementation, UEL must define residual vector `RHS` and Jacobian/stiffness matrix `AMATRX`; other flag values request stiffness-only, damping-only, mass-only, residual-only, initial acceleration, or perturbation output contributions. - UEL examples in the manual include a two-node structural user element behaving as a linear truss, with `*USER ELEMENT`, `*ELEMENT`, and `*UEL PROPERTY` input contracts. This is a strong candidate for a first reproducible artifact pattern if the project targets user elements. - VUEL is the Explicit user element analogue, but this investigation did not yet drill into its detailed interface. It should be treated as a separate research item before implementation planning. ### Other relevant subroutine families - `USDFLD`/`VUSDFLD`: redefine field variables at material points; useful for field-dependent material behavior and damage/softening controls. - `UFIELD`/`VUFIELD`: define predefined field variables, often nodal or field-level before interpolation. - `UVARM`: generate custom element output in Standard; useful for exposing derived variables from existing material state. - `UEXTERNALDB`/`VEXTERNALDB`: manage external databases, files, cross-subroutine data exchange, or coupling with external programs at key analysis points. - `UHARD`/`VUHARD`: define hardening/yield surface size behavior without replacing the full material update. - `ORIENT`: define material/local directions. - `DLOAD`/`VDLOAD`, `DISP`/`VDISP`, `UAMP`/`VUAMP`: load, motion, and amplitude customization. - `UINTER`/`VUINTER`/`VUINTERACTION`, `FRIC`/`VFRIC`: contact/interface behavior customization. ### Observed public example repository patterns - The NTNU repository contains examples for UVARM, USDFLD/VUSDFLD, UHARD/VUHARD, UMAT/VUMAT, UEXTERNALDB/VEXTERNALDB, plus a Modified Johnson-Cook example combining VUHARD and VUSDFLD. - Each example folder generally contains a Fortran subroutine, Abaqus input files, post-processing Python scripts, plotting scripts, and a PDF describing the subroutine, input file structure, and results. - The V_UMAT folder includes paired Standard/Explicit material examples: `UMAT.f`, `UMAT_MODEL.f`, `VUMAT.f`, `VUMAT_SHELL.f`, Standard/Explicit `.inp` files, post-processing scripts, plotting scripts, and a talk PDF. - The V_USDFLD folder contains Standard and Explicit field-variable variants and both patch and two-element post-processing scripts. - The repository README cautions that the examples were checked but may not be bug-free and are not necessarily validation-quality. Therefore this repository is useful as a development-pattern source, not as acceptance evidence. ## Candidate Benchmarks and Verification Artifacts | benchmark_id | source | benchmark_type | physics | target_quantities | artifact_needs | applicability | | --- | --- | --- | --- | --- | --- | --- | | umat-single-element-elastic | Abaqus manuals, inferred from single-element testing guidance | smoke / analytical | Standard user material | stress, `DDSDDE`, state variables, convergence behavior | one-element `.inp`, user material constants, expected analytical stress/Jacobian CSV, `.msg` summary | Best first harness target for UMAT ABI and constitutive update tests. | | vumat-single-element-elastic | Abaqus manuals, inferred from single-element testing guidance | smoke / analytical | Explicit vectorized user material | `stressNew`, `stateNew`, energy arrays, stable explicit response | one-element Explicit `.inp`, density, expected stress history CSV | Tests `nblock` loop and tensor ordering/precision assumptions. | | umat-vs-built-in-linear-elastic | Abaqus material docs and UMAT/VUMAT contract | regression / reference comparison | Standard Cauchy stress update | stress, strain, SDV, reaction/displacement if run through Abaqus | built-in and UMAT `.inp` pair, reference CSVs from approved Abaqus run | Requires user-generated Abaqus artifacts; not generated by agents. | | vumat-vs-built-in-linear-elastic | Abaqus material docs and VUMAT contract | regression / reference comparison | Explicit user material | stress, strain, internal energy, displacement/reaction | built-in and VUMAT `.inp` pair, reference CSVs | Must control objective-rate and tensor-ordering assumptions. | | uel-two-node-truss | Abaqus UEL manual example | analytical / user element | Standard user element | element residual, stiffness, nodal displacement, reaction, energy | `*USER ELEMENT` truss `.inp`, UEL source, expected truss analytical CSV | Strong first UEL target; maps cleanly to existing FESA truss/bar solver ideas. | | usdfld-field-update | NTNU V_USDFLD examples plus Abaqus field-variable docs | regression / patch | Field-dependent material data | field values, SDV, stress changes driven by field | Standard/Explicit `.inp`, field/SDV CSVs, post scripts | Example repository useful for structure; official acceptance must come from controlled reference artifacts. | | uexternaldb-file-exchange | Abaqus overview and NTNU V_UEXTERNALDB examples | integration / harness | External file/database lifecycle | call order, file creation, increment/step metadata | `.inp`, user subroutine, expected external log file schema | Useful for harnessing file I/O and thread-safety policy. | ## Verification Relevance - code_verification: High. UMAT/VUMAT/UEL logic can be unit-tested outside Abaqus if constitutive kernels or element kernels are factored away from the Abaqus ABI wrapper. - solution_verification: High but artifact-dependent. Abaqus runs must be performed by a human or approved external process and stored as reference artifacts. - validation: Out of scope for this first research pass. Public examples and single-element checks do not validate physical material models against experiments. - reference_comparison: High. The current FESA reference-comparison pattern can be adapted to compare approved Abaqus `.odb`-extracted CSVs, `.dat`/`.msg` summaries, and post-processing outputs. ## Applicability Limits - The main manual sources are Abaqus 2016 mirrors. Interface details must be rechecked against the target installed Abaqus version before implementation. - Official Dassault documentation may require customer access; the accessible sources here are university mirrors of the 2016 manuals. - This research does not approve any specific material model, element formulation, stress integration algorithm, or tangent derivation. - This research does not create, modify, or validate reference CSVs. - This research does not run Abaqus, compile Fortran, or test compiler/linker compatibility. - The project harness currently assumes C++17/MSVC/CMake/CTest. Abaqus user subroutine development will likely require a new or extended validation path for Fortran/C/C++ source plus `abaqus job=... user=...` and/or `abaqus make`, guarded by environment detection. - The NTNU examples are useful for repository layout and one/two-element workflows, but their README explicitly limits their verification/validation claims. ## Implications for This Project Harness - The project should not simply rename the existing C++ solver harness. Abaqus user subroutine development has a different execution boundary: source is compiled and linked by the Abaqus execution procedure, not by CMake alone. - A pragmatic architecture is to split each subroutine into: - a thin Abaqus ABI wrapper matching the exact manual signature; - a testable kernel for constitutive update, field update, element residual/tangent, or external database behavior; - small Abaqus `.inp` reference models and approved CSV/log artifacts. - The current TDD guard should be extended or complemented for Fortran/C/C++ Abaqus source. For production subroutine changes, require either: - a kernel unit test, or - an Abaqus artifact comparison test, or - both for UMAT/VUMAT/UEL. - Workspace validation should gain explicit modes: - no-Abaqus mode: run Python harness tests and pure kernel tests only; - Abaqus-available mode: run compile/link smoke tests and selected `abaqus job=... user=...` reference cases; - artifact-comparison mode: compare stored solver output CSV/log artifacts without rerunning Abaqus. - Reference artifact contracts should include `.inp`, user subroutine source version/hash, Abaqus version, compiler version, precision, command line, `.msg`/`.dat`/`.log` tail, extracted CSVs, and post-processing script provenance. - For UMAT/VUMAT, the first implementation gate should focus on a simple elastic or J2 plastic single-element model before complex material laws. - For UEL, the first implementation gate should focus on a two-node truss/bar element because it has analytical residual/stiffness checks and aligns with the existing FESA solver roadmap. ## Downstream Handoff ### Requirement Agent - Decide the primary target: UMAT, VUMAT, UEL/VUEL, field subroutines, output subroutines, or external database routines. - Record target Abaqus version, operating system, compiler/toolchain, and whether Abaqus is available for local validation. - Define whether the project will develop Fortran-first subroutines, C/C++ subroutines, or Fortran ABI wrappers over C++ kernels. ### I/O Definition Agent - Define supported Abaqus input keyword subset for each target subroutine family: - UMAT/VUMAT: `*MATERIAL`, `*USER MATERIAL`, `*DEPVAR`, `*DENSITY`, output requests. - UEL: `*USER ELEMENT`, `*UEL PROPERTY`, `*ELEMENT`, output requests. - USDFLD/VUSDFLD: `*FIELD`, `*DEPVAR`, material field dependency contracts. - Define CSV schemas for stress, strain, state variables, element residual/stiffness summaries, displacement, reaction, energy, and call-log/debug outputs. ### Reference Model Agent - Start with one-element UMAT/VUMAT and two-node UEL truss models. - Require metadata for Abaqus version, compiler version, precision, command, input deck, source hash, and extraction script. - Treat all generated Abaqus outputs as read-only reference artifacts after approval. ### Implementation Planning Agent - Plan RED tests around pure kernels first, then ABI wrapper compile smoke, then Abaqus artifact comparison if Abaqus is available. - Require targeted tests for tensor component ordering, state variable allocation, material constant parsing, element deletion flags, and `DDSDDE` symmetry/unsymmetry policy. - Preserve no-Abaqus validation path so the repository remains testable without commercial solver access. ### Numerical Review Agent - For UMAT, review stress update algorithm, objective rates, state integration, consistent tangent, symmetry, and hybrid/incompressible assumptions. - For VUMAT, review corotational frame assumptions, vectorization loop, stable explicit response, energy accounting, and deleted material point behavior. - For UEL, review residual sign convention, tangent consistency, mass/damping/stiffness contributions, `LFLAGS` branching, and energy terms. ## Open Issues - Target Abaqus version is not yet specified. The cited manuals are Abaqus 2016. - Target implementation language is not yet specified. Abaqus supports Fortran, C, and C++, but most public examples and legacy workflows are Fortran-first. - Windows compiler compatibility is not yet specified. Abaqus, Visual Studio, Intel Fortran/oneAPI, and MSVC versions must be aligned. - It is not yet clear whether local Abaqus execution is available in this workspace. The current harness should keep a no-Abaqus path. - The project needs a license policy for third-party example code before copying or adapting code from public repositories.