Hashin-Shtrikman

class mechmean.approximation.HashinShtrikmanWalpole(phases, P_func, averaging_func)[source]

Hashin-Shtrikman scheme formulated by [Walpole1966_I], [Walpole1966_II] formatted following [Fernandez2019] (equation 22) and applicable to non-spherical Hill polarization following [Walpole1969], [Willis1977] (page 190) and [Willis1981] (pages 36, 38) including a dual scheme for singular polarizations following [Walpole1969] (page 238).

\[\begin{split}\begin{align*} \mathbb{C}^{\text{eff}} &= \mathbb{C}_{\text{0}} - \mathbb{P}_{\text{0}}^{-1} + \left< \mathbb{W} \right>^{-1} \\ %%%%%%%%%%%%%%%%%%%%%%%%%%%% \mathbb{W} &= \left( \mathbb{C} - \mathbb{C}_{\text{0}} + \mathbb{P}_{\text{0}}^{-1} \right)^{-1} \end{align*}\end{split}\]
with
  • \(\mathbb{C}_{\text{0}}\) : Stiffness of reference material

  • \(\mathbb{P}_{\text{0}}\) : Hill polarization of single inclusion in reference material

  • \(\mathbb{C}\) : Stiffness at location \(\boldsymbol{x}\) (piecewise constant phases)

  • \(\left<\right>\) : Suitable average for given microstructure. See e.g. [Walpole1966_II] equations 24, 25

Note

The Hill polarization \(\mathbb{P}_{\text{0}}\) reflects the symmetry of the two-point statistics (See [Willis1977] (page 188), [Fernandez2019] ).

__init__(phases, P_func, averaging_func)[source]
Parameters
  • phases (nested dict) – Each entry represents one phase.

  • phases[....]['material'] (material with .stiffness_mandel6) – Material of phase ‘…’.

  • phases[....]['W'] (None) – Phases must not have key ‘W’, because each phase-dict is extended by ‘W’. The resulting extended dict is passed to averging_func.

  • P_func (callcable) – Callable returning Hill polarization for given material.

  • averaging_func (callable) – Callable that takes nested dict of phases and calculates average of ‘W’.

calc_C_eff(ref_material)[source]

Calc effective stiffness for given reference material

Handle singular polarizations.

Returns

Effective stiffness

Return type

np.array (mandel6_4)

calc_strain_localization_tensor(key_phase, ref_material)[source]

Calc strain localization tensor

\[\begin{align*} \mathbb{A}_{\text{j}} = \mathbb{A}_{\text{j}}^{\text{SI}} \left< \mathbb{A}^{\text{SI}} \right>^{-1} \end{align*}\]

mapping average strain to average strain in phase j.

\[\begin{align*} \left<\mathbb{\varepsilon}\right>_{\text{j}} = \mathbb{A}_{\text{j}} \left[ \left<\mathbb{\varepsilon}\right> \right] \end{align*}\]

with

  • \(\mathbb{A}^{\text{SI}}\) : Strain localization tensor in single inclusion problem

  • \(\left<\right>\) : Suitable average for given microstructure

  • \(\left<\mathbb{\varepsilon}\right>_{\text{j}}\) : Average strain in phase j

  • \(\left<\mathbb{\varepsilon}\right>\) : Average strain

Parameters
  • key_phase (str) – Key of phase j in dict phases

  • ref_material (mechkit.material.Isotropic) – Reference material

Returns

Strain localization

Return type

np.array (mandel6_4)

calc_stress_localization_tensor(key_phase, ref_material)[source]

Calc stress localization tensor

\[\begin{align*} \mathbb{B}_{\text{j}} = \mathbb{C}_{\text{j}} \mathbb{A}_{\text{j}} \mathbb{C}_{\text{0}}^{-1} \end{align*}\]

mapping average stress to average stress in phase j.

\[\begin{align*} \left<\mathbb{\sigma}\right>_{\text{j}} = \mathbb{B}_{\text{j}} \left[ \left<\mathbb{\sigma}\right> \right] \end{align*}\]

with

  • \(\mathbb{C}_{\text{j}}\) : Stiffness of phase j

  • \(\mathbb{A}_{\text{j}}\) : Strain localization tensor of phase j

  • \(\mathbb{C}_{\text{0}}\) : Stiffness of reference material

  • \(\left<\mathbb{\sigma}\right>_{\text{j}}\) : Average stress in phase j

  • \(\left<\mathbb{\sigma}\right>\) : Average stress

Parameters
  • key_phase (str) – Key of phase j in dict phases

  • ref_material (mechkit.material.Isotropic) – Reference material

Returns

Stress localization

Return type

np.array (mandel6_4)

class mechmean.approximation.HSW_VolumeFraction(phases, P_func)[source]

mechmean.approximation.HashinShtrikmanWalpole with volume average calculated as weighted summation

class mechmean.approximation.HSW_SinglePhaseOrientation(phases, P_func, orientation_averager)[source]

mechmean.approximation.HashinShtrikmanWalpole with orientation average over single phase

__init__(phases, P_func, orientation_averager)[source]
Parameters
class mechmean.approximation.Kehrer2019(phases, averaging_func, k)[source]

Two-step Hashin-Shtrikman homogenization scheme for fiber reinforced composites [Kehrer2019]

Step 1

\[\begin{split}\begin{align*} \mathbb{C}_{\text{upp}} &= \mathbb{C}_{\text{i}} + c_{\text{m}} \text{d} \mathbb{C} \left( \mathbb{I}^{\text{S}} - c_{\text{i}} \mathbb{P}_{\text{i}}^{\text{UD}} \text{d} \mathbb{C} \right)^{-1} \\ %%%%%%%%%%%%%%%%%%%%%%%%%%%% \mathbb{C}_{\text{low}} &= \mathbb{C}_{\text{m}} - c_{\text{i}} \text{d} \mathbb{C} \left( \mathbb{I}^{\text{S}} - c_{\text{m}} \mathbb{P}_{\text{m}}^{\text{UD}} \text{d} \mathbb{C} \right)^{-1} \\ %%%%%%%%%%%%%%%%%%%%%%%%%%%% \text{d}\mathbb{C} &= \mathbb{C}_{\text{m}}-\mathbb{C}_{\text{i}} \end{align*}\end{split}\]

with \(\text{j} \in [\text{i},\text{m}]\) and

  • \(c_{\text{j}}\) : Volume fraction of phase j

  • \(\mathbb{C}_{\text{j}}\) : Stiffness of phase j

  • \(\mathbb{P}_{\text{j}}^{\text{UD}}\) : Hill polarization of needle shape in material of phase j

Step 2

For \(\text{j} \in [\text{upp},\text{low}]\)

\[\begin{split}\begin{align*} \mathbb{C}_{\text{j}}^{\text{eff}} &= \mathbb{C}_{\text{0}} - \mathbb{P}_{\text{0}}^{-1} + \left< \mathbb{A}_{\text{j}}^{\star} \right>_{\text{orientation}}^{-1} \\ %%%%%%%%%%%%%%%%%%%%%%%%%%%% \mathbb{A}_{\text{j}}^{\star} &= \left( \mathbb{P}_{\text{0}}^{-1} + \mathbb{C}_{\text{j}} - \mathbb{C}_{\text{0}} \right)^{-1} \\ %%%%%%%%%%%%%%%%%%%%%%%%%%%% \mathbb{C}_{\text{0}} &= \left( 1-k \right) \mathbb{C}_{\text{m}} + k \mathbb{C}_{\text{i}} \end{align*}\end{split}\]

with

  • \(k\) : Scalar weight of fiber phase in reference material.

  • \(\mathbb{C}_{\text{upp}}^{\text{eff}}\) : Upper effective stiffness

  • \(\mathbb{C}_{\text{low}}^{\text{eff}}\) : Lower effective stiffness

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,
        'k': 0.5,
        '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'])
>>> input_dict = {
        'phases': {
            'inclusion': {
                'material': inclusion,
                'volume_fraction': inp['c_f'],
                },
            'matrix': {
                'material': matrix,
                'volume_fraction': 1. - inp['c_f'],
                },
            },
        'k': inp['k'],
        'averaging_func': averager.average,
        }
>>> hashin = mechmean.approximation.Kehrer2019(**input_dict)
>>> C_eff = hashin.calc_C_eff()
Effective_stiffness(
upper=array(
[[ 1.793e+01,  6.792e+00,  6.440e+00, -7.925e-03, -1.225e-01,  2.797e-01],
 [ 6.792e+00,  1.666e+01,  6.502e+00, -1.443e-02, -9.110e-03,  2.566e-01],
 [ 6.440e+00,  6.502e+00,  1.438e+01, -2.853e-03, -4.822e-02, -3.038e-02],
 [-7.925e-03, -1.443e-02, -2.853e-03,  8.566e+00,  1.067e-01, -7.336e-02],
 [-1.225e-01, -9.110e-03, -4.822e-02,  1.067e-01,  8.955e+00, -1.951e-02],
 [ 2.797e-01,  2.566e-01, -3.038e-02, -7.336e-02, -1.951e-02,  1.099e+01]]
),
lower=array(
[[ 1.320e+01,  6.537e+00,  5.063e+00, -2.566e-02, -2.110e-01,  4.354e-01],
 [ 6.537e+00,  1.134e+01,  5.077e+00, -2.310e-02, -5.618e-02,  3.731e-01],
 [ 5.063e+00,  5.077e+00,  8.767e+00,  8.965e-03, -8.823e-03, -1.952e-02],
 [-2.566e-02, -2.310e-02,  8.965e-03,  3.737e+00,  1.406e-02, -9.265e-02],
 [-2.110e-01, -5.618e-02, -8.823e-03,  1.406e-02,  3.847e+00, -3.933e-02],
 [ 4.354e-01,  3.731e-01, -1.952e-02, -9.265e-02, -3.933e-02,  7.122e+00]]
)   )
__init__(phases, averaging_func, k)[source]
Parameters
  • phases (dict) – Valid phases are ‘inclusion’ and ‘matrix’.

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

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

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

  • averaging_func (callable) – Callable averaging fourth order tensor.

  • k (float in range(0,1)) – Weight of fiber phase in reference material.

calc_C_eff()[source]

Calc, set as attribute and return: Effective stiffnesses

Returns

Upper and lower effective stiffness

Return type

tuple(np.array, np.array) with arrays of shape (mandel6_4)

class mechmean.approximation.Kehrer2019HSW(phases, averaging_func, k)[source]

Implementation of mechmean.approximation.Kehrer2019 using mechmean.approximation.HashinShtrikmanWalpole

__init__(phases, averaging_func, k)[source]

See mechmean.approximation.Kehrer2019

calc_C_eff()[source]

See mechmean.approximation.Kehrer2019

class mechmean.approximation.HSW2StepInterpolatedReferenceMaterial(phases, averaging_func, k1, k2)[source]

Based on Kehrer2019 but with interpolation parameter in both steps combined with the inverse scheme for singular polarizations leading to a generic structure