Source code for material_mechanics.materials.material_law

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
This module holds possible material laws
"""
import logging
import numpy as np

from ..tools import force_symmetry


# ====================
# Set up module logger
# ====================
logger = logging.getLogger(__name__)


[docs]class HookesLaw: r""" representation of Hookes Law of elasticity for two- and three-dimensional stress states in materials .. note:: poisson ratios are in international notation. The first index points to the causing strain. The second index points to the resulting strain. :param stiffness: List or tuples of pairs of stiffness values. Each pair holds the stiffness in a major axis of the material and the shear stiffness in the plane perpendicular to that axis. ((:math:`\sigma_{11}`, :math:`G_{23}`) for the 1-direction) :param poisson: List or tuples of pairs of poisson ratios. each pair holds the two poisson ratios perpendicular to a major material axis. So the first entry holds (:math:`\nu_{23}`, :math:`\nu_{32}`). :type stiffness: List or tuple of lists or tuples of floats :type poisson: List or tuple of lists or tuples of floats """ def __init__(self, stiffness, poisson, *args, **kwargs): self.symmetry = kwargs.get('symmetry', 'mean') self.e1 = stiffness[0][0] self.e2 = stiffness[1][0] self.e3 = stiffness[2][0] self.g23 = stiffness[0][1] self.g13 = stiffness[1][1] self.g12 = stiffness[2][1] self.nu23 = poisson[0][0] self.nu32 = poisson[0][1] self.nu13 = poisson[1][0] self.nu31 = poisson[1][1] self.nu12 = poisson[2][0] self.nu21 = poisson[2][1] @property def compliance_matrix(self): """ returns the compliance matrix for three-dimensional stress states :return: compliance matrix (6x6) :rtype: numpy.ndarray """ compliance_matrix = np.zeros((6, 6)) compliance_matrix[0, 0] = 1. / self.e1 compliance_matrix[0, 1] = -self.nu21 / self.e2 compliance_matrix[0, 2] = -self.nu31 / self.e3 compliance_matrix[1, 0] = -self.nu12 / self.e1 compliance_matrix[1, 1] = 1. / self.e2 compliance_matrix[1, 2] = -self.nu32 / self.e3 compliance_matrix[2, 0] = -self.nu13 / self.e1 compliance_matrix[2, 1] = -self.nu23 / self.e2 compliance_matrix[2, 2] = 1. / self.e3 compliance_matrix[3, 3] = 1. / self.g23 compliance_matrix[4, 4] = 1. / self.g13 compliance_matrix[5, 5] = 1. / self.g12 return compliance_matrix @property def compliance_matrix_2d(self): """ returns the compliance matrix for two-dimensional stress states :return: compliance matrix (3x3) :rtype: numpy.ndarray """ compliance_matrix = np.zeros((3, 3)) compliance_matrix[0, 0] = 1. / self.e1 compliance_matrix[0, 1] = -self.nu21 / self.e2 compliance_matrix[1, 0] = -self.nu12 / self.e1 compliance_matrix[1, 1] = 1. / self.e2 compliance_matrix[2, 2] = 1. / self.g12 return compliance_matrix @property def stiffness_matrix(self): """ returns the stiffness matrix for three-dimensional stress states :return: stiffness matrix (6x6) :rtype: numpy.ndarray """ return np.linalg.inv(self.compliance_matrix) @property def stiffness_matrix_2d(self): """ returns the stiffness matrix for two-dimensional stress states :return: stiffness matrix (3x3) :rtype: numpy.ndarray """ return np.linalg.inv(self.compliance_matrix_2d)