composites API (composites)#

The composites module includes functions used to calculate properties and perform analysis on laminated composites and isotropic plates.

Classical, first- and third-order shear deformation theories are supported. For classical plate theories or classical laminated plate theories (CLPT), and for the first-order shear deformation theory (FSDT) the relevant matrices are the A, B, D and Ats. For the third-order shear deformation theory (TSDT) the relevant matrices are the A, B, D, E, F, H; and the Abar_ts, Dts and Fts. The matrices Ats, Abar_ts, Dts and Fts are 2 by 2 matrices containing transverse shear stiffnesses, ordered as [[44, 45], [45, 55]] with index 4 corresponding to yz and index 5 to xz. All these matrices are part of the Laminate object.

The FSDT transverse shear stiffness Ats already contains the shear correction, computed by default with the equilibrium approach of Rohwer (1988), see Laminate.calc_transverse_shear_stiffness(), such that no shear correction factor should be applied to it. The uncorrected constant-strain stiffness, used in the TSDT, is Abar_ts. Other methods are selected with the argument shear_correction of laminated_plate() and isotropic_plate():

  • 'rohwer' (default): Rohwer (1988), equilibrium of two cylindrical bending states, full 2x2 matrix

  • 'vlachoutsis': Vlachoutsis (1992), energy equivalence with direction-wise neutral surfaces

  • 'whitney': Whitney (1973), unsymmetric orthotropic laminates, identical to 'vlachoutsis'

  • 'chow': Chow (1971), symmetric laminates only

  • 'birman_bert': Birman and Bert (2002), equivalence of the average transverse shear strain

  • 'thickness_shear': Yang, Norris and Stavsky (1966), first thickness-shear frequency, requires positive ply densities

  • 'constant': 5/6

  • None: no correction

Problem-dependent, a posteriori factors in the sense of Noor and Peters (1989) are supported by Laminate.calc_equilibrium_transverse_shear() and Laminate.calc_aposteriori_energy(), which recover the transverse shear stresses and their energies from the strain gradients of an FSDT solution.

The implementation of the CLTP, FSDT and TSDT closely follows the notation adopted by:

Reddy J.N., Mechanics of laminated composite plates and shells, theory and
analysis. Second Edition, Boca Raton: CRC Press, 2004.

For isotropic plates, the Laminate object is also used for convenience, and since offsetting the mid-surface is supported, there can be an extension-bending coupling (B matrix) different than zero even for isotropic plates.

The most convenient usage is probably with the composites.utils.isotropic_plate() or the composites.utils.laminated_plate() functions:

from composites import laminated_plate

laminaprop = (E11, E22, nu12, G12, G13, G23)
plyt = ply_thickness
stack = [0, 90, +45, -45]
plate = laminated_plate(stack, plyt=plyt, laminaprop=laminaprop)

and with the composites.utils.isotropic_plate() function:

from composites import isotropic_plate

plate = isotropic_plate(thickness=5., E=E, nu=nu)

Where the laminate stiffness matrix, the often called ABD matrix, with shape=(6, 6), can be accessed using:

>>> plate.ABD

and when transverse shear stiffnesses are required, with shape=(2, 2):

>>> plate.Ats

with the shear correction already applied. The transverse shear stresses through the thickness, for given shear forces Qy and Qx, are obtained with:

>>> tau_yz, tau_xz = plate.calc_transverse_shear_stress(z, Qy, Qx)

Composites Core Module (composites.core)#

class composites.core.GradABD#

Container to store the gradients of the ABD matrices with respect to the lamination parameters

Attributes:
gradAij, gradBij, gradDij, gradAtsijtuple of 2D np.array objects

The shapes of these gradient matrices are:

gradAij: (6, 5) gradBij: (6, 5) gradDij: (6, 5) gradAtsij: (3, 3)

They contain the gradients of each laminate stiffness with respect to the thickness and respective lamination parameters. The transverse shear terms are the constant-strain (uncorrected) Abar44, Abar45, Abar55, as given by laminate_from_LaminationParameters(). The rows and columns correspond to:

gradAij:

    h xiA1 xiA2 xiA3 xiA4
A11
A12
A16
A22
A26
A66

gradBij:

    h xiB1 xiB2 xiB3 xiB4
B11
B12
B16
B22
B26
B66

gradDij:

    h xiD1 xiD2 xiD3 xiD4
D11
D12
D16
D22
D26
D66

gradAtsij:

       h xiAts1 xiAts2
Abar44
Abar45
Abar55

Methods

calc_LP_grad(thickness, mat, lp)

Gradients of the shell stiffnesses with respect to the thickness and lamination parameters

calc_LP_grad(thickness, mat, lp)#

Gradients of the shell stiffnesses with respect to the thickness and lamination parameters

Parameters:
thicknessfloat

The total thickness of the laminate

matMatLamina object

Material object

lpLaminationParameters object

The container class with all lamination parameters already defined

Returns:
None

The attributes of the object are updated.

gradAtransij#

Deprecated, use gradAtsij instead

class composites.core.Lamina#
Attributes:
plyidint

Identificaiton of the composite lamina

matlaminaMatLamina object

A MatLamina object

hfloat

Ply thickness

thetadegfloat

Ply angle in degrees

Methods

get_constitutive_matrix()

Return the constitutive matrix

get_transf_matrix_displ_to_laminate()

Return displacement transformation matrix from lamina to laminate

get_transf_matrix_stress_to_lamina()

Return stress transformation matrix from laminate to lamina

get_transf_matrix_stress_to_laminate()

Return stress transformation matrix from lamina to laminate

rebuild()

Update constitutive matrices

get_constitutive_matrix()#

Return the constitutive matrix

get_transf_matrix_displ_to_laminate()#

Return displacement transformation matrix from lamina to laminate

get_transf_matrix_stress_to_lamina()#

Return stress transformation matrix from laminate to lamina

get_transf_matrix_stress_to_laminate()#

Return stress transformation matrix from lamina to laminate

rebuild()#

Update constitutive matrices

Reference:

Reddy, J. N., Mechanics of Laminated Composite Plates and Shells - Theory and Analysys. Second Edition. CRC PRESS, 2004.

class composites.core.Laminate#
Attributes:
plieslist

List of plies

stacklist

List of angles for each ply

hfloat

Total thickness of the laminate

offsetfloat

Offset at the normal direction

e1, e2float

Equivalent laminate moduli in directions 1 and 2

g12float

Equivalent laminate shear modulus in the 12 direction

nu12, nu21float

Equivalent laminate Poisson ratios in the 12 and 21 directions

A44, A45, A55float

Transverse shear stiffnesses of the first-order shear deformation theory (FSDT), with the shear correction already applied according to shear_correction. They are ready to be used in the element and no shear correction factor should be applied to them downstream. See calc_transverse_shear_stiffness().

Abar44, Abar45, Abar55float

Constant-strain (uncorrected) transverse shear stiffnesses \(\bar{A}_{ts} = \sum_k C_s^{(k)} h_k\). These are the terms to be used together with Dts and Fts in the third-order shear deformation theory (TSDT), which needs no shear correction.

Abarbar44, Abarbar45, Abarbar55float

Constant-stress transverse shear stiffnesses \(\bar{\bar{A}}_{ts} = h^2 [\sum_k (C_s^{(k)})^{-1} h_k]^{-1}\), for comparison only. Equal to nan when a ply has a singular \(C_s^{(k)}\).

shear_correctionstr or None

Method used to obtain A44, A45, A55 from the ply data: 'rohwer', 'vlachoutsis', 'whitney', 'chow', 'birman_bert', 'thickness_shear', 'constant' or None, see calc_transverse_shear_stiffness(). Default is 'rohwer'.

scf_k13, scf_k23float

Reported shear correction ratios A55/Abar55 and A44/Abar44. They are informative only, the correction is already inside A44, A45, A55.

intrhofloat

Integral \(\int_{-h/2+offset}^{+h/2+offset} \rho(z) dz\), used in equivalent single layer finite element mass matrices

intrhozfloat

Integral \(\int_{-h/2+offset}^{+h/2+offset} \rho(z)z dz\), used in equivalent single layer finite element mass matrices

intrhoz2float

Integral \(\int_{-h/2+offset}^{+h/2+offset} \rho(z)z^2 dz\), used in equivalent single layer finite element mass matrices

Methods

calc_aposteriori_energy(grad_x, grad_y)

Transverse shear strain energy of the recovered stresses

calc_constitutive_matrix()

Calculate the laminate constitutive terms

calc_equilibrium_transverse_shear(grad_x, grad_y)

Transverse shear stresses recovered from the actual strain gradients

calc_equivalent_properties()

Calculate the equivalent laminate properties

calc_lamination_parameters()

Calculate the lamination parameters.

calc_scf()

Recompute the transverse shear stiffness and return the ratios

calc_transverse_shear_stiffness()

Update the transverse shear stiffnesses A44, A45, A55

calc_transverse_shear_stress(z, Qy, Qx)

Transverse shear stresses at a given height

make_balanced()

Make a balanced laminate

make_orthotropic()

Make an orthotropic laminate

make_smeared()

Make a laminated with smeared properties

make_symmetric()

Make a symmetric laminate

Abar_ts#

Constant-strain [[Abar44, Abar45], [Abar45, Abar55]]

Uncorrected transverse shear stiffness, to be used with Dts and Fts in the third-order shear deformation theory (TSDT).

Abarbar_ts#

Constant-stress [[Abarbar44, Abarbar45], [Abarbar45, Abarbar55]]

Atrans#

Deprecated, use Ats instead

Returns the same corrected matrix as Ats.

Ats#

Transverse shear stiffness matrix [[A44, A45], [A45, A55]]

Index 4 corresponds to \(yz\) and index 5 to \(xz\), such that \(\{Q_y, Q_x\}^T = A_{ts} \{\gamma_{yz}, \gamma_{xz}\}^T\). The shear correction is already applied, see calc_transverse_shear_stiffness().

Dtrans#

Deprecated, use Dts instead

Dts#

TSDT transverse shear stiffness [[D44, D45], [D45, D55]]

Ftrans#

Deprecated, use Fts instead

Fts#

TSDT transverse shear stiffness [[F44, F45], [F45, F55]]

calc_aposteriori_energy(grad_x, grad_y)#

Transverse shear strain energy of the recovered stresses

With the stresses of calc_equilibrium_transverse_shear() and the strains \(\{\bar\gamma_{yz}, \bar\gamma_{xz}\} = (C_s^{(k)})^{-1} \{\bar\tau_{yz}, \bar\tau_{xz}\}\), the energies per unit area of reference surface of Noor and Peters (1989), Eq. (7):

\[\bar{U}_{13} = \int \frac{1}{2} C_{55} \bar\gamma_{xz}^2 dz \qquad \bar{U}_{23} = \int \frac{1}{2} C_{44} \bar\gamma_{yz}^2 dz\]

integrated exactly with three Gauss-Legendre points per ply. The a posteriori factors follow by equating their integral over the domain with that of the FSDT, \(\frac{1}{2} Q_x^2/\bar{A}_{55}\) and \(\frac{1}{2} Q_y^2/\bar{A}_{44}\), i.e. Eqs. (8)-(9) of Noor and Peters (1989), with \(Q = k^0 \bar{A} \gamma^0\) the shear forces of the FSDT.

References:

Noor, A. K. and Peters, J. M. “A posteriori estimates for the shear correction factors in multi-layered composite cylinders”, Journal of Engineering Mechanics, Vol. 115, 1225-1244, 1989.

Parameters:
grad_x, grad_yarray-like

See calc_equilibrium_transverse_shear().

Returns:
U13, U23, Qy, Qxnp.ndarray

The energies and the resultants \(\int \bar\tau dz\) of the recovered stresses, with shape (npts,).

calc_constitutive_matrix()#

Calculate the laminate constitutive terms

This is the commonly called ABD matrix with shape=(6, 6) when the classical laminated plate theory is used, or the ABD matrix when the first-order shear deformation theory is used, containing the transverse shear terms.

The transverse shear stiffnesses A44, A45, A55 are calculated at the end by calc_transverse_shear_stiffness(), with the shear correction selected by shear_correction already applied.

calc_equilibrium_transverse_shear(grad_x, grad_y, z=None)#

Transverse shear stresses recovered from the actual strain gradients

Integrates the three-dimensional equilibrium equations from the bottom face, where the tractions vanish, with the in-plane stresses of each ply \(\sigma^{(k)} = C^{(k)} (\varepsilon^{(0)} + z\varepsilon^{(1)})\):

\[\begin{split}\tau_{xz}(z) = -\int_{z_1}^{z} \left( c_1 \left[ \varepsilon^{(0)}_{,x} + \bar{z} \varepsilon^{(1)}_{,x} \right] + c_3 \left[ \varepsilon^{(0)}_{,y} + \bar{z} \varepsilon^{(1)}_{,y} \right] \right) d\bar{z} \\ \tau_{yz}(z) = -\int_{z_1}^{z} \left( c_2 \left[ \varepsilon^{(0)}_{,y} + \bar{z} \varepsilon^{(1)}_{,y} \right] + c_3 \left[ \varepsilon^{(0)}_{,x} + \bar{z} \varepsilon^{(1)}_{,x} \right] \right) d\bar{z}\end{split}\]

where \(c_1\), \(c_2\) and \(c_3\) are the rows of \(C^{(k)}\) that give \(\sigma_{xx}\), \(\sigma_{yy}\) and \(\tau_{xy}\), respectively, and \(z_1\) is the bottom face. It uses the gradients of the generalized strains of the actual solution, as in the a posteriori approach of Noor and Peters (1989), instead of the two cylindrical bending states of calc_transverse_shear_stiffness(). The top face is traction free only if the gradients satisfy the in-plane equilibrium of the stress resultants.

References:

Noor, A. K. and Peters, J. M. “A posteriori estimates for the shear correction factors in multi-layered composite cylinders”, Journal of Engineering Mechanics, Vol. 115, 1225-1244, 1989.

Parameters:
grad_x, grad_yarray-like, shape (6,) or (npts, 6)

Derivatives with respect to \(x\) and \(y\) of \(\{\varepsilon_{xx}^{(0)}, \varepsilon_{yy}^{(0)}, \gamma_{xy}^{(0)}, \varepsilon_{xx}^{(1)}, \varepsilon_{yy}^{(1)}, \gamma_{xy}^{(1)}\}\), at npts points.

zarray-like or None

Heights from the reference surface. If None, the three Gauss-Legendre points of each ply are used.

Returns:
z, tau_yz, tau_xznp.ndarray

The heights, with shape (nz,), and the stresses, with shape (npts, nz).

calc_equivalent_properties()#

Calculate the equivalent laminate properties

The following attributes are updated:

e1, e2, g12, `u12, nu21

calc_lamination_parameters()#

Calculate the lamination parameters.

The following attributes are calculated:

xiA, xiB, xiD, xiE

calc_scf()#

Recompute the transverse shear stiffness and return the ratios

Deprecated since version 0.9.1: Use calc_transverse_shear_stiffness(), called automatically by calc_constitutive_matrix(), and read scf_k13 and scf_k23.

The ratios are informative only, since the correction is already applied to A44, A45, A55 by calc_transverse_shear_stiffness(). If shear_correction is None, it is set to 'rohwer' before recomputing.

Returns:
scf_k13, scf_k23tuple of float

The ratios A55/Abar55 and A44/Abar44, also stored in the attributes scf_k13 and scf_k23.

calc_transverse_shear_stiffness()#

Update the transverse shear stiffnesses A44, A45, A55

Called at the end of calc_constitutive_matrix(), and computed once per laminate. The attributes A44, A45, A55 are the transverse shear stiffnesses of the first-order shear deformation theory (FSDT) with the shear correction already applied, ready to be used in the element. No shear correction factor should be applied to them downstream.

Conventions: \(\{\tau_{yz}, \tau_{xz}\}^T\), \(\{Q_y, Q_x\}^T\), \(A_{ts} = [[A_{44}, A_{45}], [A_{45}, A_{55}]]\), index 4 corresponds to \(yz\) and index 5 to \(xz\). The coordinate \(z\) is measured from the reference surface, with the plies running from \(z_1 = -h/2 + offset\) to \(z_{N+1} = +h/2 + offset\), and \(C_s^{(k)} = [[q_{44L}, q_{45L}], [q_{45L}, q_{55L}]]\), which is in general a full matrix. None of the methods depends on offset, and all of them are evaluated with \(z\) measured from the mid-surface, which avoids the round-off of large values of offset.

The method is selected by the attribute shear_correction:

  • 'rohwer' (default): equilibrium approach of Rohwer (1988). The transverse shear stresses are obtained from the equilibrium of two cylindrical bending states, with zero tractions at the bottom and top faces and continuity at every interface, \(\{\tau_{yz}, \tau_{xz}\}^T = f^{(k)}(z) \{Q_y, Q_x\}^T\). The 2x2 stiffness is obtained from the complementary energy:

    \[A_{ts} = \left[ \sum_k \int_{z_k}^{z_{k+1}} f^{(k)T} \left(C_s^{(k)}\right)^{-1} f^{(k)} dz \right]^{-1}\]

    The integrand is a polynomial of degree 4 in \(z\) within each ply, such that the 3-point Gauss-Legendre rule used per ply is exact. The method is valid for arbitrary anisotropic and unsymmetric laminates, and the result does not depend on offset. The result is not invariant to a rotation of the element axes, because the two cylindrical bending states are tied to the \(x\) and \(y\) axes. This is inherent to the method: for a \([0, 90]_s\) CFRP laminate, deviations up to about 7 % are observed at 45 degrees.

  • 'vlachoutsis': the scalar factors \(k_{13}\), \(k_{23}\) of Vlachoutsis (1992) are applied to the constant-strain stiffness, A55 = k13*Abar55, A44 = k23*Abar44, and the ad-hoc A45 = (k13 + k23)/2*Abar45, which cannot represent the coupling of angle-ply laminates with Abar45 = 0. The factors use \(C_{11}\) and \(C_{22}\) of each ply in laminate axes and the direction-wise neutral surfaces, being exact only for specially orthotropic plies.

  • 'whitney': the scalar factors of Whitney (1973), Eqs. (3)-(7), extending Chow (1971) to unsymmetric orthotropic laminates in cylindrical bending, with \(\sigma_{xx} = -C_{11}(B_{11} - A_{11}z) Q_x/(D_{11}A_{11} - B_{11}^2)\), i.e. the neutral surface \(z_n = B_{11}/A_{11}\), and the same energy equivalence. The result is identical to 'vlachoutsis'.

  • 'chow': the scalar factors of Chow (1971), Eqs. (11)-(12), with the transverse shear stress of a symmetric laminate obtained from the one-dimensional equilibrium \(\tau_{xz} = Q_x g(z)/D_{11}\), \(g(z) = -\int_{-h/2}^{z} C_{11} \bar{z} d\bar{z}\), and \(k_{13} = D_{11}^2 / (\bar{A}_{55} \int g^2/C_{55} dz)\), analogously for \(k_{23}\) with \(C_{22}\), \(D_{22}\) and \(C_{44}\). The coordinate is measured from the mid-surface and the laminate must be symmetric about it. For symmetric laminates the result is identical to 'vlachoutsis', whose neutral surfaces then coincide with the mid-surface. The factors are applied as in 'vlachoutsis'.

  • 'birman_bert': the average shear strain factors of Birman and Bert (2002), Eq. (13) and Appendix B, obtained by equating the thickness integral of the transverse shear strain of the equilibrium distribution with that of the FSDT, \(k_{13} = R_1 h / (\bar{A}_{55} \int g_1/C_{55} dz)\), analogously for \(k_{23}\). The equilibrium distribution \(g_\alpha(z)\) and the bending stiffness \(R_\alpha\) about the direction-wise neutral surface are the same as in 'vlachoutsis', which generalizes Eq. (13), derived for symmetric cross sections, to unsymmetric laminates. It gives \(k = 1\) for a homogeneous plate. The factors are applied as in 'vlachoutsis'. Note that the value recommended by Birman and Bert (2002) for sandwich structures, \(K = 1\) applied to \(\bar{A}_{55} = \sum_k C_{55}^{(k)} h_k\) (their Eqs. A5-A7), is None.

  • 'thickness_shear': dynamic factors of Yang, Norris and Stavsky (1966), as described by Sun and Whitney (1973), extending the criterion of Mindlin (1951) to laminates, i.e. matching the frequency of the first thickness-shear mode of the FSDT, \(\omega^2 = k_{13} \bar{A}_{55} / \bar{I}_2\), with the exact frequency of the laminate, computed with a transfer matrix through the plies for the anti-plane motion \(u(z)\), with \(\rho^{(k)} \ddot{u} = (C_{55}^{(k)} u_{,z})_{,z}\), traction-free faces and continuity of \(u\) and \(\tau_{xz}\) at every interface. The rotatory inertia about the centre of mass, \(\bar{I}_2 = I_2 - I_1^2/I_0\), makes the result independent of offset. Analogously for \(k_{23}\) with \(C_{44}\). The coupling \(C_{45}\) between the two directions is neglected in the eigenproblem, and the factors are applied as in 'vlachoutsis'. It gives \(k = \pi^2/12\) for a homogeneous plate. The ply densities must be positive.

  • 'constant': \(k = 5/6\), i.e. A44 = 5/6*Abar44, A45 = 5/6*Abar45, A55 = 5/6*Abar55.

  • None: no correction, A44 = Abar44, A45 = Abar45, A55 = Abar55.

The following attributes are also updated: Abar44, Abar45, Abar55 (constant strain), Abarbar44, Abarbar45, Abarbar55 (constant stress, nan if a ply has a singular \(C_s^{(k)}\)), and the ratios scf_k13 = A55/Abar55 and scf_k23 = A44/Abar44, which are informative only. For 'rohwer' the through-thickness distribution used by calc_transverse_shear_stress() is also stored.

References:

Rohwer, K. “Improved transverse shear stiffness for layered finite elements”, DFVLR-FB 88-32, 1988.

Vlachoutsis, S. “Shear correction factors for plates and shells”, Int. Journal for Numerical Methods in Engineering, Vol. 33, 1537-1552, 1992.

Whitney, J. M. “Shear correction factors for orthotropic laminates under static load”, Journal of Applied Mechanics, Vol. 40, 302-304, 1973.

Chow, T. S. “On the propagation of flexural waves in an orthotropic laminated plate and its response to an impulsive load”, Journal of Composite Materials, Vol. 5, 306-319, 1971.

Birman, V. and Bert, C. W. “On the choice of shear correction factor in sandwich structures”, Journal of Sandwich Structures and Materials, Vol. 4, 83-95, 2002.

Yang, P. C., Norris, C. H. and Stavsky, Y. “Elastic wave propagation in heterogeneous plates”, International Journal of Solids and Structures, Vol. 2, 665-684, 1966.

Sun, C. T. and Whitney, J. M. “Theories for the dynamic response of laminated plates”, AIAA Journal, Vol. 11, 178-183, 1973.

Mindlin, R. D. “Influence of rotatory inertia and shear on flexural motions of isotropic, elastic plates”, Journal of Applied Mechanics, Vol. 18, 31-38, 1951.

Raises:
ValueError

If shear_correction is not recognized; if a ply has a singular transverse shear constitutive matrix \(C_s^{(k)}\), e.g. g13 = 0 or g23 = 0 (all methods except 'constant' and None); if the ABD matrix of the laminate is singular ('rohwer'); if the laminate is not symmetric ('chow'); or if a ply has a non-positive density ('thickness_shear').

calc_transverse_shear_stress(z, Qy, Qx)#

Transverse shear stresses at a given height

Evaluates the equilibrium distribution of Rohwer (1988):

\[\begin{split}\begin{Bmatrix} \tau_{yz} \\ \tau_{xz} \end{Bmatrix} = f^{(k)}(z) \begin{Bmatrix} Q_y \\ Q_x \end{Bmatrix}\end{split}\]

where \(f^{(k)}(z)\) is quadratic within each ply, vanishes at the bottom and top faces and is continuous at the ply interfaces. This is the consistent way to recover \(\tau_{xz}\) and \(\tau_{yz}\), e.g. for failure criteria, since \(C_s \gamma\) is constant within each ply and non-zero at the free surfaces. For a homogeneous plate it gives the parabola \(\tau_{xz} = 3 Q_x/(2h) (1 - 4 \bar{z}^2/h^2)\), with \(\bar{z}\) measured from the mid-surface.

The distribution only depends on the in-plane stiffnesses of the plies and is the same for every shear_correction. It is computed once by calc_transverse_shear_stiffness() when shear_correction is 'rohwer', or on the first call otherwise, and it is reset by calc_constitutive_matrix(), which must be called again if the plies are modified.

Parameters:
zfloat

Height measured from the reference surface, within \([-h/2 + offset, +h/2 + offset]\). At a ply interface both plies give the same result.

Qy, Qxfloat

Transverse shear forces per unit length, \(Q_y\) and \(Q_x\), e.g. {Qy, Qx} = Ats @ {gamma_yz, gamma_xz}.

Returns:
tau_yz, tau_xztuple of float

Transverse shear stresses.

Raises:
ValueError

If z is outside the laminate, or if the ABD matrix of the laminate is singular.

make_balanced()#

Make a balanced laminate

The attributes \(A_{16}\), \(A_{26}\), \(B_{16}\), \(B_{26}\) are set to zero to make a balanced laminate.

make_orthotropic()#

Make an orthotropic laminate

The attributes \(A_{16}\), \(A_{26}\), \(B_{16}\), \(B_{26}\), \(D_{16}\), \(D_{26}\) are set to zero to make an orthotropic laminate.

make_smeared()#

Make a laminated with smeared properties

The \(B_{ij}\) terms of the constitutive matrix are set to zero.

The \(D_{ij}\) terms are calculated from the membrane terms \(A_{ij}\) according to \(D_{ij} = (h^2 A_{ij})/12\), where \(h\) is the laminate thickness.

make_symmetric()#

Make a symmetric laminate

The \(B_{ij}\) terms of the constitutive matrix are set to zero.

class composites.core.LaminationParameters#

Lamination parameters

Attributes:
xiA1, xiA2, xiA3, xiA4float

Lamination parameters \(\xi_{Ai}\) (in-plane)

xiB1, xiB2, xiB3, xiB4float

Lamination parameters \(\xi_{Bi}\) (in-plane coupling with bending)

xiD1, xiD2, xiD3, xiD4float

Lamination parameters \(\xi_{Di}\) (bending)

xiAts1, xiAts2float

Lamination parameters \(\xi_{{A_{ts}}i}\) (transverse shear)

xiAtrans1#

Deprecated, use xiAts1 instead

xiAtrans2#

Deprecated, use xiAts2 instead

class composites.core.MatLamina#

Orthotropic material lamina

Attributes:
e1float

Young Modulus in direction 1

e2float

Young Modulus in direction 2

g12float

in-plane shear modulus

g13float

transverse shear modulus for plane 1-Z

g23float

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

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

ci

lamina stiffness constants

ui

lamina material invariants

Methods

get_constitutive_matrix()

Return the constitutive matrix

get_invariant_matrix()

Return the invariant matrix

rebuild()

Update constitutive and invariant terms

trace_normalize_plane_stress()

Trace-normalize the lamina properties for plane stress

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\).

get_constitutive_matrix()#

Return the constitutive matrix

get_invariant_matrix()#

Return the invariant matrix

rebuild()#

Update constitutive and invariant terms

Reference:

Reddy, J. N., Mechanics of laminated composite plates and shells. Theory and analysis. Second Edition. CRC Press, 2004.

trace_normalize_plane_stress()#

Trace-normalize the lamina properties for plane stress

Modify the original MatLamina object with a trace-normalization performed after calculating the trace according to Eq. 1 of reference:

Melo, J. D. D., Bi, J., and Tsai, S. W., 2017, “A Novel Invariant-Based Design Approach to Carbon Fiber Reinforced Laminates,” Compos. Struct., 159, pp. 44–52.

The trace calculated as \(tr = Q_{11} + Q_{22} + 2Q_{66}\). The universal in-plane stress stiffness components \(Q_{11},Q_{12},Q_{22},Q_{44},Q_{55},Q_{66}\) are divided by \(tr\), and the invariants \(U_1,U_2,U_3,U_4,U_5,U_6,U_7\) are calculated with the normalized stiffnesses, such they also become trace-normalized invariants. These can be accessed using the u1,u2,u3,u4,u5,u6,u7 attributes.

composites.core.laminate_from_LaminationParameters(thickness, mat, lp)#

Return a Laminate object based in the thickness, material and lamination parameters

Parameters:
thicknessfloat

The total thickness of the laminate

matMatLamina object

Material object

lpLaminationParameters object

The container class with all lamination parameters already defined

Returns:
lamLaminate

laminate with the constitutive matrices already calculated

Notes

Since the through-thickness distribution of the plies is not known from the lamination parameters, no shear correction can be computed. The transverse shear stiffnesses A44, A45, A55 are therefore equal to the constant-strain Abar44, Abar45, Abar55, shear_correction is None, scf_k13 = scf_k23 = 1 and the constant-stress Abarbar44, Abarbar45, Abarbar55 are nan.

composites.core.laminate_from_lamination_parameters(thickness, matlamina, xiA1, xiA2, xiA3, xiA4, xiB1, xiB2, xiB3, xiB4, xiD1, xiD2, xiD3, xiD4, xiAts1=0.0, xiAts2=0.0, xiAtrans1=None, xiAtrans2=None)#

Return a Laminate object based in the thickness, material and lamination parameters

Note that \(\xi_{A_{ts}1}\) and \(\xi_{A_{ts}2}\) are optional and usually equal to zero, becoming important only when the transverse shear modulus is different in the two directions, i.e. when \(G_{13} \ne G{23}\).

Parameters:
thicknessfloat

The total thickness of the laminate

matlaminaMatLamina object

Material object

xiAj, xiBj, xiDj, xiAtsjfloat

The 14 lamination parameters according to the first-order shear deformation theory: \(\xi_{A1} \cdots \xi_{A4}\), \(\xi_{B1} \cdots \xi_{B4}\), \(\xi_{D1} \cdots \xi_{D4}\), \(\xi_{A_{ts}1}\) and \(\xi_{A_{ts}2}\)

xiAtrans1, xiAtrans2float, optional

Deprecated, use xiAts1 and xiAts2 instead.

Returns:
lamLaminate

laminate with the constitutive matrices already calculated. See laminate_from_LaminationParameters() for the transverse shear stiffnesses.

composites.core.make_balanced_LP(lp)#

Make balanced lamination parameters

The lamination parameters \(\xi_{A2}\) and \(\xi_{A4}\) are set to null to make a balanced laminate.

composites.core.make_orthotropic_LP(lp)#

Make orthotropic lamination parameters

The lamination parameters \(\xi_{A2}\), \(\xi_{A4}\), \(\xi_{B2}\), \(\xi_{B4}\), \(\xi_{D2}\) and \(\xi_{D4}\) are set to null to make an orthotropic laminate. The \(\xi_{D2}\) and \(\xi_{D4}\) are related to the bend-twist coupling and become often very small for balanced laminates with a large amount of plies.

composites.core.make_symmetric_LP(lp)#

Make symmetric lamination parameters

The lamination parameters \(\xi_{Bi}\) are set to null to make a symmetric laminate.

composites.core.n_double_laminate(thickness, n, angles_deg, matlamina)#

Create a N-double laminated plate using a faster code

This code is considerably faster than composites.utils.n_double_laminate().

An N-double laminate consists of \([\pm\phi_1,\pm\phi_2, \cdots, \pm\phi_n]\). With the principle of homogenization, at the limit where many plies are used we have that \(B=0\). Based on the double-double laminate as described by:

Shrivastava, S., Sharma, N., Tsai, S. W., and Mohite, P. M., 2020, “D and DD-Drop Layup Optimization of Aircraft Wing Panels under Multi-Load Case Design Environment,” Compos. Struct., 248(January), p. 112518.

Parameters:
thicknessfloat

Total plate thickness.

nint

Number of angle pairs,m defines the “N” in “N-double”.

angles_degarray-like

List of \(\phi_n\) of the N-double laminate.

matlaminaMatLamina

See MatLamina for details.

Composites Core Utils Module (composites.utils)#

composites.utils.double_double_laminate(thickness, phideg, psideg, laminaprop=None, rho=0.0)#

Create a double-double laminate

A double-double (DD) laminate consists of \([\pm\phi,\pm\psi]\), with phideg= \(\phi\), and psideg= \(\psi\). With the principle of homogenization, at the limit where many plies are used we have that \(B=0\). Reference:

Shrivastava, S., Sharma, N., Tsai, S. W., and Mohite, P. M., 2020, “D and DD-Drop Layup Optimization of Aircraft Wing Panels under Multi-Load Case Design Environment,” Compos. Struct., 248(January), p. 112518.

Parameters:
thicknessfloat

Total plate thickness.

phidegfloat

Angle \(\psi\) of the DD laminate.

psidegfloat

Angle \(\phi\) of the DD laminate.

laminaproptuple

See read_laminaprop() for details.

rhofloat, optional

Material density

composites.utils.double_double_plate(thickness, phideg, psideg, laminaprop=None, rho=0.0)#

Create a double-double laminate

A double-double (DD) laminate consists of \([\pm\phi,\pm\psi]\), with phideg= \(\phi\), and psideg= \(\psi\). With the principle of homogenization, at the limit where many plies are used we have that \(B=0\). Reference:

Shrivastava, S., Sharma, N., Tsai, S. W., and Mohite, P. M., 2020, “D and DD-Drop Layup Optimization of Aircraft Wing Panels under Multi-Load Case Design Environment,” Compos. Struct., 248(January), p. 112518.

Parameters:
thicknessfloat

Total plate thickness.

phidegfloat

Angle \(\psi\) of the DD laminate.

psidegfloat

Angle \(\phi\) of the DD laminate.

laminaproptuple

See read_laminaprop() for details.

rhofloat, optional

Material density

composites.utils.isotropic_plate(thickness, E, nu, offset=0.0, calc_scf=None, rho=0.0, shear_correction='rohwer')#

Read data for an isotropic plate

Laminate object is returned based on the inputs given.

Parameters:
thicknessfloat

Plate thickness.

Efloat

Young modulus.

nufloat, optional

Poisson’s ratio.

rhofloat, optional

Material density

offsetfloat, optional

Offset along the normal axis about the mid-surface, which influences the extension-bending coupling (B matrix).

calc_scfbool, optional

Deprecated, use shear_correction instead. When given, True is mapped to shear_correction='rohwer' and False to shear_correction=None, overriding shear_correction.

shear_correctionstr or None, optional

See laminated_plate(). For an isotropic plate 'rohwer', 'vlachoutsis', 'whitney', 'chow' and 'constant' give A44 = A55 = 5/6 G h, 'birman_bert' gives G h and 'thickness_shear' gives pi^2/12 G h, the latter requiring rho > 0.

composites.utils.laminated_plate(stack, plyt=None, laminaprop=None, rho=0.0, plyts=None, laminaprops=None, rhos=None, offset=0.0, calc_scf=None, shear_correction='rohwer')#

Read a laminate stacking sequence data.

Laminate object is returned based on the inputs given.

Parameters:
stacklist

Angles of the stacking sequence in degrees.

plytfloat, optional

When all plies have the same thickness, plyt can be supplied.

laminaproptuple, optional

When all plies have the same material properties, laminaprop can be supplied.

rhofloat, optional

Uniform material density to be used for all plies.

plytslist, optional

A list of floats with the thickness of each ply.

laminapropslist, optional

A list of tuples with a laminaprop for each ply.

rhoslist, optional

A list of floats with the material density of each ply.

offsetfloat, optional

Offset along the normal axis about the mid-surface, which influences the laminate properties.

calc_scfbool, optional

Deprecated, use shear_correction instead. When given, True is mapped to shear_correction='rohwer' and False to shear_correction=None, overriding shear_correction.

shear_correctionstr or None, optional

Method used to compute the transverse shear stiffnesses A44, A45, A55, which are returned with the correction already applied: 'rohwer' (default, equilibrium approach), 'vlachoutsis', 'whitney' (same as 'vlachoutsis'), 'chow' (symmetric laminates), 'birman_bert' (average shear strain), 'thickness_shear' (dynamic, requires rho), 'constant' (5/6) or None (no correction). See Laminate.calc_transverse_shear_stiffness().

Notes

plyt or plyts must be supplied laminaprop or laminaprops must be supplied

For orthotropic plies, the laminaprop should be:

laminaprop = (E11, E22, nu12, G12, G13, G23)

For isotropic plies, the laminaprop should be:

laminaprop = (E, nu)
composites.utils.n_double_laminate(thickness, angles_deg, laminaprop=None, rho=0.0)#

Create a N-double laminate

This code is considerably slower than composites.core.n_double_laminate().

An N-double laminate consists of \([\pm\phi_1,\pm\phi_2, \cdots, \pm\phi_n]\). With the principle of homogenization, at the limit where many plies are used we have that \(B=0\). Based on the double-double laminate as described by:

Shrivastava, S., Sharma, N., Tsai, S. W., and Mohite, P. M., 2020, “D and DD-Drop Layup Optimization of Aircraft Wing Panels under Multi-Load Case Design Environment,” Compos. Struct., 248(January), p. 112518.

Parameters:
thicknessfloat

Total plate thickness.

angles_degfloat

List of \(\phi_n\) of the N-double laminate.

laminaproptuple

See read_laminaprop() for details.

rhofloat, optional

Material density

composites.utils.n_double_plate(thickness, angles_deg, laminaprop=None, rho=0.0)#

Create a N-double laminate

This code is considerably slower than composites.core.n_double_laminate().

An N-double laminate consists of \([\pm\phi_1,\pm\phi_2, \cdots, \pm\phi_n]\). With the principle of homogenization, at the limit where many plies are used we have that \(B=0\). Based on the double-double laminate as described by:

Shrivastava, S., Sharma, N., Tsai, S. W., and Mohite, P. M., 2020, “D and DD-Drop Layup Optimization of Aircraft Wing Panels under Multi-Load Case Design Environment,” Compos. Struct., 248(January), p. 112518.

Parameters:
thicknessfloat

Total plate thickness.

angles_degfloat

List of \(\phi_n\) of the N-double laminate.

laminaproptuple

See read_laminaprop() for details.

rhofloat, optional

Material density

composites.utils.read_laminaprop(laminaprop, rho=0)#

Returns a MatLamina object based on an input laminaprop tuple

Parameters:
laminaproplist or tuple

For the most general case of tri-axial stress, use a tuple containing the folliwing entries:

laminaprop = (e1, e2, nu12, g12, g13, g23, e3, nu13, nu23)

For isotropic materials aiming calculations with tri-axial stresses, use:

g = e/(2*(1+nu))
laminaprop = (e, e, nu, g, g, g, e, nu, nu)

For othotropic materials with in-plane stresses the user can only supply:

laminaprop = (e1, e2, nu12, g12, g13, g23)

For isotropic materials with in-plane stresses the user can only supply:

laminaprop = (e, nu) # new

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

rhofloat, optional

Material density

Returns:
matlamMatLamina

A MatLamina object.

Kassapoglou’s methods (composites.kassapoglou)#

Methods based on Kassapoglou’s book.

Reference:

Kassapoglou. Design and Analysis of Composite Structures. 2nd Edition. John Wiley & Sons Ltd, 2013.

composites.kassapoglou.calc_Nxx_crit(a, b, m, n, D11, D12, D22, D66)#

Calculate uniaxial compression buckling for a composite plate

The output of this function is the result of Eq. 6.6, section 6.2 page 129. If \(m\) or \(n\) is set to None, the function searchers for the critical number of half-waves in the corresponding direction, up to 10 half-waves.

Reference:

Kassapoglou. Design and Analysis of Composite Structures. 2nd Edition. John Wiley & Sons Ltd, 2013.

Parameters:
a, bfloat

Plate length and width.

m, nint or None

Number of half-waves along the plate length and width, respectively.

D11, D12, D22, D66float

Terms of the D matrix.

Returns:
Nxx_critfloat

Critical uniaxial compression buckling load.

composites.kassapoglou.calc_Nxx_crit_combined_shear(k, a, b, D11, D12, D22, D66)#

Calculate combined uniaxial-shear buckling load for a composite plate

The output of this function is the result of Eq. 6.34, section 6.5 page 142. This function calculates the critical \(N_{xx}\) buckling load under the current level of shear load given by \(N_{xy} = k N_{xx}\).

Reference:

Kassapoglou. Design and Analysis of Composite Structures. 2nd Edition. John Wiley & Sons Ltd, 2013.

Parameters:
kfloat

Load ratio defined as \(k=N_{xy}/N_{xx}\), where \(N_{xy}\) is the current shear load, and \(N_{xx}\) the current compression load.

a, bfloat

Plate length and width.

D11, D12, D22, D66float

Terms of the D matrix.

Returns:
N0float

Critical \(N_{xx}\) buckling load under the current level of shear load given by \(N_{xy} = k N_{xx}\).

composites.kassapoglou.calc_Nxx_crit_combined_shear_full(Nxy, a, b, D11, D12, D16, D22, D26, D66)#

Calculate combined uniaxial-shear buckling load for a composite plate

This solution does not ignore the D16 and D26 terms. Furthermore, this solution takes as input \(N_{xy}\) instead of the \(k=N_{xy}/N_{xx}\) originally used by Kassapoglou.

Based on section 6.5. This function calculates the critical \(N_{xx}\) by \(N_{xy}\).

Reference:

Kassapoglou. Design and Analysis of Composite Structures. 2nd Edition. John Wiley & Sons Ltd, 2013.

Parameters:
Nxyfloat

Shear load \(N_{xy}\).

a, bfloat

Plate length and width.

D11, D12, D16, D22, D26, D66float

All terms of the D matrix.

Returns:
Nxx_critfloat

Critical \(N_{xx}\) buckling load under the current level of shear load given by \(N_{xy}\).

composites.kassapoglou.calc_Nxy_crit(a, D11, D12, D16, D22, D66, rtol=1e-05, atol=1e-06, max_iter=50)#

Calculate shear buckling for a composite plate

The output of this function is the result of Eq. 6.28, section 6.4 page 137. Variables \(AR\) and \(\alpha\) are solved using a Newton-Raphson scheme that finds the solution of Eqs. 6.29 and 6.30 simultaneously.

Reference:

Kassapoglou. Design and Analysis of Composite Structures. 2nd Edition. John Wiley & Sons Ltd, 2013.

Parameters:
afloat

Plate length.

D11, D12, D16, D22, D66float

Terms of the D matrix.

rtol, atolfloat

Relative and absolute tolerances used to solve Eq. 6.30.

max_iterint

Maximum number of iterations used in the Newton-Raphson scheme.

Returns:
Nxy_critfloat

Critical shear buckling load.

composites.kassapoglou.calc_beff(b, Px, Pcr, A11, A12, A22)#

Calculate the effective width of a plate

The output of this function is the result of Eq. 7.15, section 7.1 page 164. The effective width \(b_{eff}\) is defined as:

\(\int_y N_{xx} dy = 2{N_x}_{max} b_{eff}\)

Reference:

Kassapoglou. Design and Analysis of Composite Structures. 2nd Edition. John Wiley & Sons Ltd, 2013.

Parameters:
bfloat

Plate width.

Pxfloat

Applied compressive force.

Pcrfloat

Critical buckling force.

A11, A12, A22: float

Terms of the A matrix.

Returns:
befffloat

Effective width of the plate.