Skip to content

Add finite-strain Abaqus & thermomech support - #143

Open
chemiskyy wants to merge 5 commits into
masterfrom
feature/thermo-finite
Open

chemiskyy wants to merge 5 commits into
masterfrom
feature/thermo-finite

Conversation

@chemiskyy

Copy link
Copy Markdown
Member

Introduce finite-strain (NLGEOM) handling and kinematic forms (total vs rate/log_R) for Abaqus bridges and thermomechanical solver paths. Key changes:

  • Docs: expand Abaqus, solver and python_solver docs to describe NLGEOM, kinematic_form, statev layout and thermomechanical finite-strain rules.
  • API/headers: add prototypes for dH_dE/box_covector_2_dE, abaqus kinematics/route helpers, abaqus2smart_finite, smart2abaqus_finite_M/T, abaqus_kinematic_form/statev helpers and abaqus_finite_route in fea_transfer.hpp; add geodesic_F_increments in step_meca.hpp.
  • UMAT interface: run_umat_T signature extended to accept corate_type; umat dispatch updated to support finite-strain kinematic_form for umat_T and to run kernels in lab frame transported by DR.
  • Implementation/wrappers: use box_covector_2_dE in python wrapper logic, adjust finite-strain checks and remove previous restriction that forbade thermomechanical finite-strain blocks; update solver runner to accept thermomechanical finite-strain control types.
  • Tests: add comprehensive thermomechanical finite-strain tests and adjust existing tests accordingly.

These changes enable proper mapping between simcoon finite-strain kernels and Abaqus UMAT expectations (stress, Jacobian, heat measures), expose kinematic form choices to Python API, and add unit tests to validate thermomechanical behaviour under finite strain.

Introduce finite-strain (NLGEOM) handling and kinematic forms (total vs rate/log_R) for Abaqus bridges and thermomechanical solver paths. Key changes:

- Docs: expand Abaqus, solver and python_solver docs to describe NLGEOM, kinematic_form, statev layout and thermomechanical finite-strain rules.
- API/headers: add prototypes for dH_dE/box_covector_2_dE, abaqus kinematics/route helpers, abaqus2smart_finite, smart2abaqus_finite_M/T, abaqus_kinematic_form/statev helpers and abaqus_finite_route in fea_transfer.hpp; add geodesic_F_increments in step_meca.hpp.
- UMAT interface: run_umat_T signature extended to accept corate_type; umat dispatch updated to support finite-strain kinematic_form for umat_T and to run kernels in lab frame transported by DR.
- Implementation/wrappers: use box_covector_2_dE in python wrapper logic, adjust finite-strain checks and remove previous restriction that forbade thermomechanical finite-strain blocks; update solver runner to accept thermomechanical finite-strain control types.
- Tests: add comprehensive thermomechanical finite-strain tests and adjust existing tests accordingly.

These changes enable proper mapping between simcoon finite-strain kernels and Abaqus UMAT expectations (stress, Jacobian, heat measures), expose kinematic form choices to Python API, and add unit tests to validate thermomechanical behaviour under finite strain.
Compute and store multiplicative increment generators for finite-strain kinematic controls, and support 'gradU' (control type 6) as F = I + gradU. Changes:

- solver: set_driven_strain now accepts an increment_end flag and advances F along the geodesic for sub-increments (F1 = exp(Dtinc * dL) * F0); end-of-increment still uses tabulated target F.
- step_meca / step_thermomeca: when control_type == 6 convert BC_meca (gradU) to F_target by adding the identity; geodesic_F_increments now stores the increment generator ΔL in mecas and BC_mecas holds F at increment ends.
- Added tabulated_F_increments to compute generators ΔL = ln(F_i F_{i-1}^{-1}) from table rows (components flagged as absent keep previous values); throws on singular F.
- Updated header/docs and Python block docs to explain geodesic increments, gradU semantics, and tabular behavior.
- Added new tests (test_F_control_substeps.py) to verify sub-increment behavior, gradU == F - I semantics, and tabular rows lying on the geodesic.

These changes make kinematic steps consistent across modes, enable correct sub-increment integration along the multiplicative geodesic, and clarify control-type 6 handling.
Expose and implement a new tangent_output argument for umat_T to select returned derivative types ('box', 'material', 'spatial'). Added validation for allowed values and usage constraints (needs F0/F1 for non-'box', condensed-state rules and condense='exact' interactions), and implemented conversion logic between box/material/spatial tangents and heat scaling (r vs r/J). Updated C++ wrapper signature and Python binding (default 'box'), updated documentation strings and docs, and added unit tests covering material/spatial outputs and invalid argument cases.
Change CMNAME parsing so the `_R` suffix is accepted only when it is the entire tail (case-insensitive) and not part of longer names like EPICP_REF. Update docs (abaqus.rst) and the header comment (fea_transfer.hpp) to document the behavior. Implement stricter check in abaqus_kinematic_form (fea_transfer.cpp) to ensure `_R` is followed by a space or NUL, and replace substring extraction in umat_singleM.cpp and umat_singleT.cpp with a safer const string(cmname, 5) constructor (CMNAME is space-padded with no terminator). Extend tests (Tabaqus_finite.cpp) to cover various `_R` and non-`_R` name forms.

This branch has not been deployed

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

Labels

None yet

Projects

No open projects
Status: Backlog

Development

Successfully merging this pull request may close these issues.

1 participant