Abaqus .odb
The Abaqus output database has no public specification and is version-locked (abaqus upgrade -odb moves an old one forward); only the ODB API of a licensed Abaqus reads it. The route is contrib/abaqus_odb/odb_to_vtu.py, run by Abaqus's own Python. Where no licence is available, request the .fil results file in the input deck (*FILE FORMAT, *NODE FILE, *EL FILE): meshio++ reads it natively (Abaqus .fil).
Running it
Copy odb_to_vtu.py and contrib/common/mio_vtu_series.py into one directory, then:
abaqus python odb_to_vtu.py job.odb # job.pvd + job/
abaqus python odb_to_vtu.py job.odb out.pvd --fields U,S,PEEQ --steps Step-1import meshioplusplus
for time, mesh in meshioplusplus.read_sequence("job.pvd"):
mesh.point_data["U"], mesh.cell_data["S"]It runs on the Python 2.7 of Abaqus 2023 and before and the Python 3 of Abaqus 2024 and later, with the numpy Abaqus bundles.
What it writes
- Instances → parts. Each part instance is a
.pvdpart named after it, so a read merges them with one region per instance (part=selects one, see PVD). - Frames → steps. A time-domain frame's time is its step's total time at the start plus the frame value; frame 0 of a later step, the previous step's last state, is skipped. A frequency or modal frame (whose frame value is a frequency or an eigenvalue) comes one after the previous time, so the times keep ascending.
- Field outputs by position.
NODALoutput (U, RF, NT…) is point data; integration-point, centroidal and whole-element output (S, E, PEEQ, ELEN…) is cell data from Abaqus's ownCENTROID(orWHOLE_ELEMENT) subset, averaged over section points; output with onlyELEMENT_NODALvalues is averaged over the elements sharing a node. Components keep Abaqus's order (S11, S22, S33, S12, S13, S23). - Labels and sets.
abaqus:node_labelandabaqus:element_labelcarry the labels; every node and element set, of the instance or of the assembly, is aset:<name>0/1 mask on every part. - Elements. Continuum (
C3D,DC3D,AC3D,COH3D,SC), planar and axisymmetric (CPE,CPS,CAX,CGAX…), shell and membrane (S4R,STRI3,M3D,R3D,SFM3D…) and line (T2D,T3D,B2,B3,PIPE…) elements map by family and node count as the native.inpand.filreaders map them (Abaqus lists every such shape's nodes in meshio++'s order); connectors, springs, masses and other elements with no cell are skipped with a count.
Checked against
The script's logic is tested against a stand-in of the ODB API (tests/python/test_contrib_routes.py). The run against Abaqus itself is listed in the roadmap. The references are ODB2VTK and the Abaqus Scripting Reference's odbAccess chapter.