Mori-Tanaka

class mechmean.approximation.MoriTanaka(phases, **kwargs)[source]

Bases: TwoPhaseComposite

Approximate strain localization following [Mori1973].

The ansatz [Gross2016] (equation 8.101)

\[\begin{align*} \left<\mathbb{\varepsilon}\right>_{\text{i}} = \mathbb{A}^{\text{SI}} \left[ \left< \mathbb{\varepsilon} \right>_{\text{m}} \right] \end{align*}\]

leads to

\[\begin{split}\begin{align*} \left<\mathbb{\varepsilon}\right> &= c_{\text{m}} \left<\mathbb{\varepsilon}\right>_{\text{m}} + c_{\text{i}} \left<\mathbb{\varepsilon}\right>_{\text{i}} \\ &= c_{\text{m}} \left(\mathbb{A}^{\text{SI}}\right)^{-1} \left<\mathbb{\varepsilon}\right>_{\text{i}} + c_{\text{i}} \left<\mathbb{\varepsilon}\right>_{\text{i}} \\ &= \underbrace{ \left( c_{\text{m}} \left(\mathbb{A}^{\text{SI}}\right)^{-1} + c_{\text{i}} \mathbb{I}^{\text{S}} \right) }_{\left( \mathbb{A}_{\text{i}}^{\text{MT}} \right)^{-1}} \left<\mathbb{\varepsilon}\right>_{\text{i}} \end{align*}\end{split}\]

.

Note

The Hill polarization of the inclusion \(\mathbb{P}_{\text{i}}\) represents the geometry of the inclusion and depends on the material properties of the matrix.

__init__(phases, **kwargs)[source]
Parameters
  • phases (dict) – Valid phases are ‘inclusion’ and ‘matrix’.

  • phases['inclusion']['material'] (mechkit.material.Isotropic) – Inclusion material

  • phases['inclusion']['volume_fraction'] (float) – Volume fraction of inclusion

  • phases['inclusion']['hill_polarization'] (np.array (mandel6_4)) – Hill polarization

  • phases['matrix']['material'] (mechkit.material.Isotropic) – Matrix material

calc_A_MT_i(c_i, A_SI_i)[source]

Calc strain localization by Mori-Tanaka assumption with

\[\begin{align*} \mathbb{A}_{\text{i}}^{\text{MT}} &= \left( c_{\text{m}} \left( \mathbb{A}_{\text{i}}^{\text{SI}} \right)^{-1} + c_{\text{i}} \mathbb{I}^{\text{S}} \right)^{-1} \end{align*}\]

Note

See [Weng1990] (2.22) for a connection between average strain localization tensors of the Mori-Tanaka scheme and Hashin-Shtrikman-Walpole scheme, as the above equation can be cast into the following form:

\[\begin{split}\begin{align*} \mathbb{A}_{\text{i}}^{\text{MT}} &= \mathbb{A}_{\text{i}}^{\text{SI}} \left( c_{\text{m}} \mathbb{I}^{\text{S}} + c_{\text{i}} \mathbb{A}_{\text{i}}^{\text{SI}} \right)^{-1} \\ %%%%%%%%%%%%%%%%%%%%%%%%%%%% &= \mathbb{A}_{\text{i}}^{\text{SI}} \left( \left< \mathbb{A}^{\text{SI}} \right> \right)^{-1} \;\; \text{with $\mathbb{A}_{\text{m}}^{\text{SI}}=\mathbb{I}$ } \\ \end{align*}\end{split}\]

Note that \(\mathbb{A}_{\text{i}}^{\text{SI}} (P, C_{\text{i}}, C_{\text{surrounding material}} )\) is a function of the matrix stiffness in the Mori-Tanaka context and a function of the stiffness of the reference material in the Hashin-Shtrikman context.

Parameters
  • c_i (float) – Volume fraction of inclusion.

  • A_SI_i (np.array (mandel6_4)) – Strain localization of inclusion.

Returns

Strain localization Mori-Tanaka.

Return type

np.array (mandel6_4)

calc_C_eff()[source]

Calc, set as attribute and return: Effective stiffness

Returns

Effective stiffness

Return type

np.array (mandel6_4)

calc_A_SI_i()[source]

Wrap mechmean.approximation.TwoPhaseComposite.calc_A_SI_from_hill_polarization

class mechmean.approximation.MoriTanakaOrientationAveragedBenveniste(**kwargs)[source]

Bases: MoriTanaka

Include fiber orientation in Mori-Tanaka approximation following [Benveniste1987] and [Brylka2017] equation (2.73).

Use \(\left<\mathbb{A}_{\text{i}}^{\text{MT}}\right>_{\text{f}}\) as \(\mathbb{A}_{\text{i}}^{\text{Approximated}}\) with

\[\begin{align*} \left<\mathbb{A}_{\text{i}}^{\text{MT}}\right>_{\text{f}} = \left( c_{\text{m}} \left( \left< \mathbb{A}_{\text{i}}^{\text{SI}} \right>_{\text{f}} \right)^{-1} + c_{\text{i}} \mathbb{I}^{\text{S}} \right)^{-1} \end{align*}\]

and with the orientation averaged strain localization of the single inclusion problem \(\left<\mathbb{A}_{\text{i}}^{\text{SI}}\right>_{\text{f}}\).

Examples

>>> import mechkit
>>> inp = {
        'E_f': 73.0,
        'E_m': 3.4,
        'N4': np.array(
          [[ 4.09e-01,  1.48e-01,  1.03e-02, -2.20e-03, -1.86e-02,  3.52e-02],
           [ 1.48e-01,  2.51e-01,  6.50e-03, -2.00e-03, -5.50e-03,  3.11e-02],
           [ 1.03e-02,  6.50e-03,  9.70e-03,  8.00e-04, -1.20e-03,  4.00e-04],
           [-2.20e-03, -2.00e-03,  8.00e-04,  1.30e-02,  5.00e-04, -7.70e-03],
           [-1.86e-02, -5.50e-03, -1.20e-03,  5.00e-04,  2.06e-02, -3.20e-03],
           [ 3.52e-02,  3.11e-02,  4.00e-04, -7.70e-03, -3.20e-03,  2.97e-01]]
          ),
        'c_f': 0.22,
        'nu_f': 0.22,
        'nu_m': 0.385,
        }
>>> inclusion = mechkit.material.Isotropic(
            E=inp['E_f'],
            nu=inp['nu_f'],
            )
>>> matrix = mechkit.material.Isotropic(
            E=inp['E_m'],
            nu=inp['nu_m'],
            )
>>> averager = mechmean.orientation_averager.AdvaniTucker(N4=inp['N4'])
>>> P_func = mechmean.hill_polarization.Castaneda().needle
>>> input_dict = {
        'phases': {
            'inclusion': {
                'material': inclusion,
                'volume_fraction': inp['c_f'],
                'hill_polarization': P_func(matrix=matrix),
                },
            'matrix': {
                'material': matrix,
                },
            },
        'averaging_func': averager.average,
        }
>>> mori = mechmean.approximation.MoriTanakaOrientationAveragedBenveniste(**input_dict)
>>> C_eff = mori.calc_C_eff()
[[ 1.479e+01,  7.000e+00,  5.045e+00, -3.118e-02, -2.842e-01,  4.863e-01],
 [ 7.000e+00,  1.251e+01,  5.057e+00, -2.973e-02, -7.226e-02,  4.390e-01],
 [ 5.045e+00,  5.057e+00,  8.827e+00,  1.472e-02, -1.303e-02, -2.303e-02],
 [-3.118e-02, -2.973e-02,  1.472e-02,  3.824e+00,  1.668e-02, -1.239e-01],
 [-2.842e-01, -7.226e-02, -1.303e-02,  1.668e-02,  3.982e+00, -4.843e-02],
 [ 4.863e-01,  4.390e-01, -2.303e-02, -1.239e-01, -4.843e-02,  8.386e+00]])
__init__(**kwargs)[source]
Parameters
calc_A_SI_i()[source]

Some orientation averaging schemes are restricted to quantities with transversal isotropic material symmetry. \(\mathbb{A}_{\text{i}}^{\text{SI}}\) may lack this symmetry. The orientation averaging scheme is applied to an intermediate, stiffness-like quantity \(\mathbb{A}^{\star}\) leading to

\[\begin{split}\begin{align*} \mathbb{A}^{\star} &= \text{d}\mathbb{C} \mathbb{A}^{\text{SI}} \\ \left<\mathbb{A}^{\star}\right>_{\text{f}} &= \text{Orientation average}\left(\mathbb{A}^{\star}\right) \\ \left<\mathbb{A}_{\text{i}}^{\text{SI}}\right>_{\text{f}} &= \left(\text{d}\mathbb{C}\right)^{-1} \left<\mathbb{A}^{\star}\right>_{\text{f}} \\ \text{with } \;\; \text{d}\mathbb{C} &= \mathbb{C}_{\text{i}} - \mathbb{C}_{\text{m}}. \end{align*}\end{split}\]