adtzlr / matadi

Material Definition with Automatic Differentiation
GNU General Public License v3.0
21 stars 2 forks source link

Add Micro-sphere model for rubber elasticity #28

Closed adtzlr closed 2 years ago

adtzlr commented 2 years ago

Implement the affine, non-affine, stretch and area-stretch micro-sphere models for rubber elasticity [1].

Tasks

References

[1] C. Miehe, “A micro-macro approach to rubber-like materials. Part I: the non-affine micro-sphere model of rubber elasticity,” Journal of the Mechanics and Physics of Solids, vol. 52, no. 11. Elsevier BV, pp. 2617–2660, Nov. 2004. DOI:10.1016/j.jmps.2004.03.011

[2] P. Bažant and B. H. Oh, “Efficient Numerical Integration on the Surface of a Sphere,” ZAMM - Journal of Applied Mathematics and Mechanics / Zeitschrift für Angewandte Mathematik und Mechanik, vol. 66, no. 1. Wiley, pp. 37–49, 1986. DOI:10.1002/zamm.19860660108

adtzlr commented 2 years ago

The driving force of the 1d micro-sphere model has to be integrated w.r.t. the stretch, in order to obtain the 1d strain energy function. The Padé approximation of the inverse Langevin function will be integrated w.r.t. the stretch. Here is the result of WolframAlpha

integrate (3*N - λ^2)/(N-λ^2) dλ

which gives:

λ + 2 sqrt(N) tanh^(-1)(λ/sqrt(N))

This is transformed into a Python function:

def langevin(stretch, mu, N):
    """Langevin model (Padé approximation) given by the free energy 
    of a single chain as a function of the stretch."""

    return mu * (stretch + 2 * sqrt(N) * atanh(stretch / sqrt(N)))
adtzlr commented 2 years ago

This is possible via e6159557341e6473f7d841f37e8d55db51a2947a:

import matadi

quadrature = matadi.models.microsphere.quadrature.BazantOh(n=21)

Mat = matadi.MaterialHyperelastic(
    fun=matadi.models.microsphere.affine.stretch,
    r=quadrature.points,
    w=quadrature.weights,
    f=matadi.models.microsphere.langevin,
    bulk=5000,
    kwargs={"mu": 1.0, "N": 10}
)

lab = matadi.Lab(Mat)
data = lab.run(ux=True, bx=True, ps=True, num=50)
fig, ax = lab.plot(data, stability=True)

grafik

adtzlr commented 2 years ago

Improvements

This seems more intuitive as in 17b1038b0380a7e46bda91f4250c03621d40d8c0

import matadi

Mat = matadi.MaterialHyperelastic(
    fun=matadi.models.microsphere.affine.stretch,
    quadrature=matadi.models.microsphere.quadrature.BazantOh(n=21),
    f=matadi.models.microsphere.langevin,
    bulk=5000,
    kwargs={"mu": 1.0, "N": 10}
)

lab = matadi.Lab(Mat)
data = lab.run(ux=True, bx=True, ps=True, num=50)
fig, ax = lab.plot(data, stability=True)