Skip to content

Abaqus (.inp) ​

The Abaqus input-deck format: keyword-driven ASCII (*NODE, *ELEMENT, *NSET, *ELSET, *INCLUDE, …). Results come in the separate .fil file, the abaqus_fil format.

Format nameabaqus
Extensions.inp
Read / Write✓ / ✓
Extra dependencies—

Reading & writing ​

Native comma fields and data-section rows are source views, with nested include buffers kept alive through parsing and returned names/sets copied into owned storage. Lenient native numeric prefixes and trailing-empty comma semantics are unchanged; see the deck-token evidence. This does not extend the Python reference's cross-include id-map behavior.

The native reader views mapped/buffered source lines, keeping each include source alive through its recursive parse. Data-section rows, names and returned arrays remain owned. Writer bytes and parsing behavior are unchanged; see the deck-line comparison.

python
import meshioplusplus

mesh = meshioplusplus.read("model.inp")
meshioplusplus.abaqus.write("out.inp", mesh,
    float_fmt=".16e",
    translate_cell_names=True,
)
  • float_fmt — coordinate format.
  • translate_cell_names — if True (default), meshio++ cell types are mapped to an Abaqus element name via the lookup table below; if False, the meshio++ type string is written verbatim as TYPE=.

File structure ​

Comment lines start **; keyword lines start *. A keyword is extracted as line.partition(",")[0].strip().replace("*","").upper(). Recognized: NODE, ELEMENT, NSET, ELSET, INCLUDE; anything else is simply skipped line-by-line (not block-skipped) until the next * line.

  • *NODE: comma-separated id, x, y, [z] rows.
  • *ELEMENT, TYPE=<abaqus_type>[, ELSET=<name>]: comma-separated integer rows flattened into one token stream, then split into fixed-width records of (node count for TYPE) + 1 (element id + node ids). An inline ELSET= also registers a cell_sets entry spanning that whole block.
  • *NSET, NSET=<name>[, GENERATE] / *ELSET, ELSET=<name>[, GENERATE]: member ids, or (with GENERATE) exactly 3 ids start, end, step expanded via np.arange. *ELSET may also reference other set names (non-numeric first token), resolved recursively.
  • *INCLUDE, INPUT=<path>: recursively reads and merges another .inp file (path resolved relative to the current file's directory if not found as-is).

Cell types ​

The Abaqus element-type table is large (trusses, beams, shells, solids); a representative excerpt:

Abaqusmeshio++Abaqusmeshio++
T2D2, T3D2, B21, B31lineC3D8, C3D8R, S4, CPS4hexahedron* / quad
T2D3, T3D3, B22, B32line3C3D20, C3D20Rhexahedron20
CPS3, STRI3, S3triangleC3D4tetra
STRI65, CPE6triangle6C3D4Htetra**
S8R, S8R5quad8C3D10, C3D10Mtetra10
S9R5quad9C3D6wedge
C3D15wedge15

(*C3D8* → hexahedron, S4/CPS4/etc. → quad; both map to distinct meshio++ types depending on whether the card is a solid or shell element. **C3D4H mapped to the invalid type string "tetra4" before v16.7.0; it is tetra now, and the writer still names a tetra C3D4.)

The reverse map (meshio++ → Abaqus) is lossy: several Abaqus names collapse to one meshio++ type, so the writer always emits whichever Abaqus name happens to be last in the internal table for that meshio++ type — the originating keyword is not preserved through a read→write round trip.

Data mapping ​

  • point_sets / cell_sets — from *NSET/*ELSET (including inline ELSET= on *ELEMENT), keyed by set name.
  • No point_data/cell_data/field_data is produced — the Abaqus reader never populates them.

Quirks & limitations ​

  • translate_cell_names=False bypasses the lookup table entirely and writes the meshio++ type string as-is; useful for pass-through of unsupported types, but has no C++ equivalent (the C++ writer always looks up the table and throws if the type isn't found).
  • GENERATE sets require exactly 3 numbers (start,end,step) or raise ReadError.
  • *ELSET can reference other set names transitively, including elsets implicitly created by an inline ELEMENT ... ELSET=.
  • The C++ reader handles *NSET/*ELSET (including GENERATE, references to other set names, and the implicit set of *ELEMENT, ELSET=) and *INCLUDE (resolved relative to the including file, nested at most 8 deep), so these files no longer fall back to the Python reader.
  • The C++ writer is only attempted when float_fmt == ".16e", translate_cell_names == True, and the mesh has no point_sets/ cell_sets.
  • The C++ reader's Abaqus-type lookup tries the upper-cased type string first, then falls back to the as-written (case-sensitive) string — a leniency the Python reader (a plain case-sensitive dict lookup) doesn't have.

Notes ​

  • tests/python/meshes/abaqus/UUea.inp — point-sum 4950.0, 50 cells, 10 cell_sets.
  • nle1xf3c.inp (MIT Abaqus course material) — point-sum ≈32.215275528, 12 cells, 3 cell_sets.
  • element_elset.inp — exercises inline ELSET= on *ELEMENT.
  • wInclude_main.inp + wInclude_bulk.inp — exercises *INCLUDE.

Released under the MIT License.