Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add UserMaterialStrain for small-strain elastic-plastic material formulations #345

Closed
adtzlr opened this issue Nov 17, 2022 · 3 comments · Fixed by #346
Closed

Add UserMaterialStrain for small-strain elastic-plastic material formulations #345

adtzlr opened this issue Nov 17, 2022 · 3 comments · Fixed by #346
Labels
enhancement New feature or request

Comments

@adtzlr
Copy link
Owner

adtzlr commented Nov 17, 2022

The idea is to use only one single function for both the stress and the elasticity evaluation (like UMAT in Abaqus, HYPELA2 in Marc, etc). A tangent=True input could be provided for effective evaluations.

Input Arguments for function: de, e (old), s (old), statevars (old)

Outputs: dsde, s (new), statevars (new)

@adtzlr adtzlr added the enhancement New feature or request label Nov 17, 2022
@adtzlr
Copy link
Owner Author

adtzlr commented Nov 18, 2022

The current implementation is based on the strain increment. Old stress and old strain are also provided (internally as state variables). The additional **kwargs are used for the tangent-flag and may be extended in the future.

def fun(, εn, σn, ζn, **kwargs):
    return dσdε, σ, ζ
    
umat = UserMaterialStrain(material=fun, **kwargs)

@adtzlr
Copy link
Owner Author

adtzlr commented Nov 18, 2022

A linear-elastic material formulation could be implemented like this.

from felupe.math import identity, cdya, dya, trace

def linear_elastic(, εn, σn, ζn, λ, μ, **kwargs):
    """3D linear-elastic material formulation.

    Arguments
    ---------
    dε : ndarray
        Incremental strain tensor.
    εn : ndarray
        Old strain tensor.
    σn : ndarray
        Old stress tensor.
    ζn : ndarray
        Old state variables.
    λ : float
        First Lamé-constant.
    μ : float
        Second Lamé-constant (shear modulus).
    """

    # change of stress due to change of strain
    I = identity()
     = 2 * μ *  + λ * trace() * I

    # update stress and evaluate elasticity tensor
    σ = σn + 
    dσdε = 2 * μ * cdya(I, I) + λ * dya(I, I)

    # update state variables (not used here)
    ζ = ζn

    return dσdε, σ, ζ

umat = UserMaterialStrain(material=linear_elastic, μ=1, λ=2)

@adtzlr
Copy link
Owner Author

adtzlr commented Nov 18, 2022

Implementation:

def linear_elastic(de, εn, σn, ζn, λ, μ, **kwargs):

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant