"""
Composite Matlamina Module (:mod:`compmech.composite.matlamina`)
================================================================
.. currentmodule:: compmech.composite.matlamina
"""
import numpy as np
from compmech.constants import DOUBLE
from compmech.logger import *
[docs]
class MatLamina(object):
r"""
Orthotropic material lamina
========== ==========================================================
attributes description
========== ==========================================================
e1 Young Modulus in direction 1
e2 Young Modulus in direction 2
g12 in-plane shear modulus
g13 transverse shear modulus for plane 1-Z
g23 transverse shear modulus for plane 2-Z
nu12 Poisson's ratio 12
nu13 Poisson's ratio 13
nu23 Poisson's ratio 23
nu21 Poisson's ratio 21: use formula nu12/e1 = nu21/e2
nu31 Poisson's ratio 31: use formula nu31/e3 = nu13/e1
nu32 Poisson's ratio 32: use formula nu23/e2 = nu32/e3
rho especific mass (mass / volume)
a1 thermal expansion coeffiecient in direction 1
a2 thermal expansion coeffiecient in direction 2
a3 thermal expansion coeffiecient in direction 3
tref reference temperature
st1,st2 allowable tensile stresses for directions 1 and 2
sc1,sc2 allowable compressive stresses for directions 1 and 2
ss12 allowable in-plane stress for shear
strn allowable strain for direction 1
q11 lamina constitutive constant 11
q12 lamina constitutive constant 12
q13 lamina constitutive constant 13
q21 lamina constitutive constant 21
q22 lamina constitutive constant 22
q23 lamina constitutive constant 23
q31 lamina constitutive constant 31
q32 lamina constitutive constant 32
q33 lamina constitutive constant 33
q44 lamina constitutive constant 44
q55 lamina constitutive constant 55
q66 lamina constitutive constant 66
u matrix with lamina invariants
c matrix with lamina stiffness coefficients
========== ==========================================================
Notes
-----
For isotropic materials when the user defines `\nu` and `E`, `G` will be
recaculated based on equation: `G = E/(2 \times (1+\nu))`; in a lower
priority if the user defines `\nu` and `G`, `E` will be recaculated based
on equation: `E = 2 \times (1+\nu) \times G`.
"""
def __init__(self):
super(MatLamina, self).__init__()
self.e1 = None
self.e2 = None
self.e3 = 0
self.g12 = None
self.g13 = None
self.g23 = None
self.nu12 = None
self.nu13 = 0
self.nu21 = None
self.nu23 = 0
self.nu31 = 0
self.nu32 = 0
self.rho = None
self.a1 = None
self.a2 = None
self.a3 = None
self.st1 = None
self.st2 = None
self.sc1 = None
self.sc2 = None
self.ss12 = None
self.strn = None
self.q11 = None
self.q12 = None
self.q13 = None
self.q21 = None
self.q22 = None
self.q23 = None
self.q31 = None
self.q32 = None
self.q33 = None
self.q44 = None
self.q55 = None
self.q66 = None
self.u = None
def rebuild(self):
#
# from references:
# Reddy, J. N., Mechanics of laminated composite plates and shells.
# Theory and analysis. Second Edition. CRC Press, 2004.
e1 = self.e1
e2 = self.e2
e3 = self.e3
nu12 = self.nu12
nu21 = self.nu21
nu13 = self.nu13
nu31 = self.nu31
nu23 = self.nu23
nu32 = self.nu32
delta = (1-nu12*nu21-nu23*nu32-nu31*nu13-2*nu21*nu32*nu13)/(e1*e2)
c11 = (1 - nu23*nu23)/(delta*e2)
c12 = (nu21 + nu31*nu23)/(delta*e2)
c13 = (nu31 + nu21*nu32)/(delta*e2)
c22 = (1 - nu13*nu31)/(delta*e1)
c23 = (nu32 + nu12*nu31)/(delta*e1)
c33 = e3*(1 - nu12*nu21)/(delta*e1*e2)
c44 = self.g23
c55 = self.g13
c66 = self.g12
self.c = np.array(
[[c11, c12, c13, 0, 0, 0],
[c12, c22, c23, 0, 0, 0],
[c13, c23, c33, 0, 0, 0],
[ 0, 0, 0, c44, 0, 0],
[ 0, 0, 0, 0, c55, 0],
[ 0, 0, 0, 0, 0, c66]], dtype = DOUBLE)
#
# from references:
# hansen_hvejsen_2007 page 43
#
# Guerdal Z., R. T. Haftka and P. Hajela (1999), Design and
# Optimization of Laminated Composite Materials, Wiley-Interscience.
den = (1 - self.nu12 * self.nu21
- self.nu13 * self.nu31
- self.nu23 * self.nu32
- self.nu12 * self.nu23 * self.nu31
- self.nu13 * self.nu21 * self.nu32)
den = np.array(den, dtype=DOUBLE)
self.q11 = self.e1*(1 - self.nu23 * self.nu32) / den
self.q12 = self.e1*(self.nu21 + self.nu23 * self.nu31) / den
self.q13 = self.e1*(self.nu31 + self.nu21 * self.nu32) / den
self.q21 = self.e2*(self.nu12 + self.nu13 * self.nu32) / den
self.q22 = self.e2*(1 - self.nu13 * self.nu31) / den
self.q23 = self.e2*(self.nu32 + self.nu12 * self.nu31) / den
self.q31 = self.e3*(self.nu13 + self.nu12 * self.nu32) / den
self.q32 = self.e3*(self.nu23 + self.nu13 * self.nu21) / den
self.q33 = self.e3*(1 - self.nu12 * self.nu21) / den
self.q44 = self.g12
self.q55 = self.g23
self.q66 = self.g13
#
# from reference:
# Jones R. M. (1999), Mechanics of Composite Materials, second edn,
# Taylor & Francis, Inc., 325 Chestnut Street, Philadelphia,
# PA 19106. ISBN 1-56032-712-X
# slightly changed to include the transverse shear terms u6 ans
# u7, taken from ABAQUS Example Problems Manual, vol1,
# example 1.2.2 Laminated composite shell: buckling of a
# cylindrical panel with a circular hole
#
u1 = (3*self.q11 + 3*self.q22 + 2*self.q12 + 4*self.q44) / 8.
u2 = (self.q11 - self.q22) / 2.
u3 = (self.q11 + self.q22 - 2*self.q12 - 4*self.q44) / 8.
u4 = (self.q11 + self.q22 + 6*self.q12 - 4*self.q44) / 8.
u5 = (u1-u4) / 2.
u6 = (self.q55 + self.q66) / 2.
u7 = (self.q55 - self.q66) / 2.
self.u = np.array(
[[u1, u2, 0, u3, 0], # q11
[u1, -u2, 0, u3, 0], # q22
[u4, 0, 0, -u3, 0], # q12
[u6, u7, 0, 0, 0], # q55
[u6, -u7, 0, 0, 0], # q66
[ 0, 0, -u7, 0, 0], # q56
[u5, 0, 0, -u3, 0], # q44
[ 0, 0, u2/2, 0, u3], # q14
[ 0, 0, u2/2, 0, -u3]], dtype=DOUBLE) # q24
def read_inputs(self, inputs={}):
if len(inputs) > 0:
self = user_setattr(self, inputs)
if not self.nu21:
nu21 = np.array(self.nu12*self.e2/self.e1, dtype=DOUBLE)
self.nu21 = nu21
if not self.nu12:
nu12 = np.array(self.nu21*self.e1/self.e2, dtype=DOUBLE)
self.nu12 = nu12
[docs]
def read_laminaprop(laminaprop=None):
"""Returns a ``MatLamina`` object based on an input ``laminaprop`` tuple
Parameters
----------
laminaprop : list or tuple
Tuple containing the folliwing entries:
(e1, e2, nu12, g12, g13, g23, e3, nu13, nu23)
for othotropic materials the user can only supply:
(e1, e2, nu12, g12, g13, g23)
for isotropic materials the user can only supply:
(e1, e2, nu12)
====== ==============================
symbol value
====== ==============================
e1 Young Module in direction 1
e2 Young Module in direction 2
nu12 12 Poisson's ratio
g12 12 Shear Modulus
g13 13 Shear Modulus
g23 13 Shear Modulus
e3 Young Module in direction 3
nu13 13 Poisson's ratio
nu23 23 Poisson's ratio
====== ==============================
Returns
-------
matlam : MatLamina
A :class:`.MatLamina` object.
"""
matlam = MatLamina()
#laminaProp = (e1, e2, nu12, g12, g13, g23, e3, nu13, nu23)
if laminaprop == None:
error('laminaprop must be a tuple in the following format:\n\t'
+'(e1, e2, nu12, g12, g13, g23, e3, nu13, nu23)')
if len(laminaprop) == 3: #ISOTROPIC
e = laminaprop[0]
nu = laminaprop[2]
g = e/(2*(1+nu))
laminaprop = (e, e, nu, g, g, g, e, nu, nu)
nu12 = laminaprop[2]
if len(laminaprop) < 9:
e2 = laminaprop[1]
laminaprop = tuple(list(laminaprop)[:6] + [e2, nu12, nu12])
matlam.e1 = laminaprop[0]
matlam.e2 = laminaprop[1]
matlam.e3 = laminaprop[6]
matlam.nu12 = laminaprop[2]
matlam.nu13 = laminaprop[7]
matlam.nu23 = laminaprop[8]
matlam.nu21 = matlam.nu12 * matlam.e2 / matlam.e1
matlam.nu31 = matlam.nu13 * matlam.e3 / matlam.e1
matlam.nu32 = matlam.nu23 * matlam.e3 / matlam.e2
matlam.g12 = laminaprop[3]
matlam.g13 = laminaprop[4]
matlam.g23 = laminaprop[5]
matlam.rebuild()
return matlam