Abaqus migration ================ If your starting point is an Abaqus ``.inp`` deck (Standard or Explicit), this page is the bridge into femorph-solver. The mapping is mostly mechanical — the keyword vocabulary is distinctive but every concept has a direct counterpart. For the one-table cheat-sheet, see :doc:`terminology`. For the full keyword-by-keyword coverage, keep going. Loading an INP deck ------------------- Single call (``from_inp``) reads the keyword-style deck and returns a :class:`~femorph_solver.Model` ready to assemble:: from femorph_solver.interop.abaqus import from_inp model = from_inp("rotor.inp") model.fix(nodes=clamped_nodes, dof="ALL") result = model.solve_static() The reader handles Abaqus 6.14+ standard / explicit decks written through ``*HEADING`` / ``*NODE`` / ``*ELEMENT`` / ``*MATERIAL`` / ``*BOUNDARY`` / ``*CLOAD`` / ``*STEP`` blocks. Decks generated through Abaqus/CAE export, abaqus2matlab, and the ``abaqus`` Python scripting API all parse cleanly. What's read ----------- The reader covers the linear-elastic structural-mechanics slice femorph-solver supports today. Element types — the core mapping table: ========================== ============================================ Abaqus element type Maps to femorph-solver ========================== ============================================ ``C3D8`` ``ELEMENTS.HEX8`` (plain Gauss) ``C3D8R`` ``ELEMENTS.HEX8`` (reduced — same kernel today) ``C3D8H`` ``ELEMENTS.HEX8`` (hybrid → plain HEX8) ``C3D8I`` ``ELEMENTS.HEX8(integration="enhanced_strain")`` — Simo-Rifai EAS ``C3D20`` / ``C3D20R`` ``ELEMENTS.HEX20`` ``C3D10`` / ``C3D10M`` ``ELEMENTS.TET10`` ``C3D15`` ``ELEMENTS.WEDGE15`` (degenerate HEX20) ``S4`` / ``S4R`` ``ELEMENTS.QUAD4_SHELL`` (Mindlin-Reissner) ``B31`` ``ELEMENTS.BEAM2`` (Bernoulli) ``T3D2`` ``ELEMENTS.TRUSS2`` (axial bar) ``CPS4`` / ``CPS4R`` ``ELEMENTS.QUAD4_PLANE`` plane-stress ``CPE4`` / ``CPE4R`` ``ELEMENTS.QUAD4_PLANE`` plane-strain (BC sets the regime) ``MASS`` ``ELEMENTS.POINT_MASS`` ``SPRING2`` / ``SPRINGA`` ``ELEMENTS.SPRING`` ========================== ============================================ Keyword blocks the reader processes: ======================================== ============================================ Abaqus keyword Effect on the Model ======================================== ============================================ ``*NODE`` Grid points + global coordinates ``*ELEMENT, TYPE=...`` Element connectivity (cell type chosen via the table above) ``*ELSET`` / ``*NSET`` Named sets used for BC / load assignment ``*MATERIAL`` + ``*ELASTIC`` Isotropic material (E + nu, plus optional rho) ``*DENSITY`` Material density on the in-progress material ``*ELASTIC, type=ENGINEERING_CONSTANTS`` Orthotropic material (full 9-constant form) ``*SOLID SECTION`` Property → element-set binding for solids ``*SHELL SECTION`` Shell thickness + property binding ``*BEAM SECTION`` Beam cross-section + property binding ``*BOUNDARY`` :meth:`Model.fix` per pinned DOF ``*BOUNDARY, ENCASTRE`` Equivalent to ``Model.fix(dof="ALL")`` ``*BOUNDARY, XSYMM`` Symmetry plane normal to x (and Y / Z analogues) ``*CLOAD`` :meth:`Model.apply_force` (translational + rotational components) ``*DLOAD, P`` Distributed surface pressure ``*DLOAD, GRAV`` Gravity body force ``*DSLOAD`` Distributed surface load (vector form) ``*MPC`` Multi-point constraint (cyclic-symmetry only at present) ``*STEP`` / ``*END STEP`` Step boundary — first step processed; multi-step decks warn on the rest ======================================== ============================================ What's flagged but not read --------------------------- The reader emits a warning and skips: - ``C3D8R, ELEMENT_TECHNIQUE=ENHANCED`` — Abaqus's enhanced-hourglass-control flavour. Closest equivalent is ``C3D8I`` which we map to HEX8-EAS already. - ``C3D6`` (linear wedge), ``C3D4`` (linear tet), and composite ``S8R`` — not yet shipped. - ``CONN3D2`` connector elements — connector library is on the planned roadmap. - ``*PLASTIC``, ``*HYPERELASTIC``, ``*VISCOELASTIC`` — non-linear material cards. Linear elastic only at present. - ``*INITIAL CONDITIONS`` — pre-stress / temperature initial state needs the planned thermal-stress workflow. - ``*RESTART`` / ``*OUTPUT`` — output-control directives. We always emit the canonical ``.pv`` file via ``StaticResult.save``. - Multi-step ``*STEP`` blocks beyond the first — handle as separate ``Model`` instances. Procedure / step types ---------------------- Abaqus declares the analysis type via the ``*STEP`` block's procedure keyword. The reader is geometry + BC + load focused — it ignores the procedure keyword and lets you pick the analysis type via the ``Model`` API: ============================== ============================================ Abaqus procedure femorph-solver call ============================== ============================================ ``*STATIC`` :meth:`Model.solve_static` ``*FREQUENCY`` :meth:`Model.solve_modal` ``*BUCKLE`` not yet shipped (planned) ``*STEADY STATE DYNAMICS`` :meth:`Model.solve_harmonic` ``*DYNAMIC, IMPLICIT`` :meth:`Model.solve_transient` ``*DYNAMIC, EXPLICIT`` not shipped (explicit dynamics planned) ``*MODAL DYNAMIC`` :meth:`Model.solve_transient` (mode-superposition mode) ============================== ============================================ This separation lets the same geometry serve multiple analysis types without re-parsing the deck. Result-format readback ---------------------- The reader is INP-only. Reading Abaqus ``.odb`` output isn't currently supported — the binary format is proprietary and the documented Python API requires a paid Abaqus license to import the libraries it depends on. An NPZ-format converter ``odb_npz`` is shipped in :mod:`femorph_solver.interop.abaqus._odb_npz` for users who exported their ODB through the Abaqus Python API to NPZ; the recommended workflow is to solve through femorph-solver and export to ``.pv``:: from femorph_solver.interop.abaqus import from_inp model = from_inp("model.inp") result = model.solve_static() result.save("model.pv", model) Edge cases worth flagging ------------------------- **DOF ordering.** Abaqus orders DOFs as ``(U1, U2, U3, R1, R2, R3)`` — same content as femorph-solver's ``(UX, UY, UZ, ROTX, ROTY, ROTZ)``, just renamed. No re-mapping needed. **Free-form vs fixed.** Abaqus INP is comma-separated free-form throughout; the reader handles arbitrary whitespace. **Comment cards** (``**``). Stripped silently. **Continuation lines** (lines ending in trailing comma). Joined transparently. **Set references by name** (``ELSET=mybolts`` / ``NSET=clamp``). Resolved against the deck's named-set definitions — out-of-order references work because the reader does two passes. **Local coordinate systems** (``*ORIENTATION``). Read but currently warned-and-skipped — every field is interpreted in the global Cartesian frame. Local-coordinate support is on the planned roadmap. **Step amplitude curves** (``*AMPLITUDE``). Static decks parse them but the amplitude is currently applied as the deck's reference value; time-varying load tables need the transient solver's amplitude binding (planned). Concrete migration recipe ------------------------- For a typical static-analysis deck: .. code-block:: python from femorph_solver.interop.abaqus import from_inp # 1. Load the deck. All the *NODE / *ELEMENT / # *MATERIAL / *BOUNDARY / *CLOAD blocks above # populate the Model. model = from_inp("aircraft_panel.inp") # 2. Optionally inspect or modify: print(f"{model.grid.n_points} nodes, {model.grid.n_cells} cells") # 3. Solve. result = model.solve_static() # 4. Export to canonical ``.pv`` for downstream # post-processing in the femorph-solver gallery # recipes (:doc:`/gallery/post-processing/index`). result.save("aircraft_panel.pv", model) # 5. Stress recovery + design check follow the # standard recipes — same code regardless of which # deck you started from: from femorph_solver.recover import compute_nodal_stress, stress_invariants sigma = compute_nodal_stress(model, result.displacement.ravel()) inv = stress_invariants(sigma) print(f"Peak σ_VM = {inv['von_mises'].max() / 1e6:.2f} MPa") Cross-references ---------------- - :doc:`terminology` — the one-table Rosetta covering every concept across femorph-solver / MAPDL / NASTRAN / Abaqus / LS-DYNA. - :doc:`nastran` — the NASTRAN equivalent of this page. - :doc:`/getting-started/mapdl-interop` — the MAPDL equivalent. - :doc:`/reference/elements/index` — per-element technical sheets, each carrying a cross-vendor mapping table that starts from the femorph-solver name and lists the Abaqus element type.