Composites Core Module (composites.core)#

Classes of the material (MatLamina), of the ply (Lamina) and of the laminate (Laminate), of the lamination parameters (LaminationParameters) and of their gradients (GradABD), and functions that create a Laminate from lamination parameters or from the angles of an N-double laminate. The functions of composites.utils create these objects from the ply data.

class composites.core.GradABD#

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

Created with all gradients equal to zero, which are updated by calc_LP_grad(). The object can be pickled. The deprecated property gradAtransij is an alias of gradAtsij.

Attributes:
gradAij, gradBij, gradDij, gradAtsijdouble[:, ::1]

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. Column 0 has the dimension of the respective stiffness divided by a length and the other columns the dimension of the stiffness. 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

Updates gradAij, gradBij, gradDij and gradAtsij with the derivatives of the stiffnesses computed by laminate_from_LaminationParameters() from thickness, from the invariants u1 to u7 of mat and from the lamination parameters of lp; column 0 contains the derivatives with respect to the thickness. The entries [0, 2], [1, 1] and [2, 2] of gradAtsij, which do not depend on the lamination parameters, are not updated. All six rows of gradAij, gradBij and gradDij are updated, including row 5 (A66, B66, D66), whose derivatives with respect to \(\xi_{A3}\), \(\xi_{B3}\) and \(\xi_{D3}\) are \(-h u_3\), \(-h^2/4 \, u_3\) and \(-h^3/12 \, u_3\).

Parameters:
thicknessfloat

The total thickness of the laminate, length

matMatLamina object

Material object

lpLaminationParameters object

The container class with all lamination parameters already defined

Returns:
None

The attributes of the object are updated.

Notes

The stiffnesses of laminate_from_LaminationParameters() are \(A = h \, U \{1, \xi_A\}\), \(B = h^2/4 \, U \{0, \xi_B\}\), \(D = h^3/12 \, U \{1, \xi_D\}\) and \(\bar{A}_{ts} = h \, U_{ts} \{1, \xi_{A_{ts}}\}\), with \(U\) the rows of the in-plane terms of MatLamina.get_invariant_matrix() and \(U_{ts}\) those of the transverse shear terms. At constant lamination parameters, \(\partial A/\partial h = U \{1, \xi_A\}\), \(\partial B/\partial h = h/2 \, U \{0, \xi_B\}\), \(\partial D/\partial h = h^2/4 \, U \{1, \xi_D\}\) and \(\partial \bar{A}_{ts}/\partial h = U_{ts} \{1, \xi_{A_{ts}}\}\), and at constant thickness the derivatives with respect to the lamination parameters are the columns of \(U\) multiplied by \(h\), \(h^2/4\) and \(h^3/12\), respectively, and those of \(U_{ts}\) by \(h\).

gradAtransij#

Deprecated, use gradAtsij instead

Issues a DeprecationWarning and returns gradAtsij.

Returns:
gradAtsijdouble[:, ::1]

Gradients of shape (3, 3), see GradABD.

class composites.core.Lamina#

Ply of a laminate

Created with all attributes equal to zero and matlamina equal to None. After matlamina, h and thetadeg are set, rebuild() computes the trigonometric terms of the ply angle and the ply stiffnesses q11L to q55L in the laminate axes. Usually created by laminated_plate().

Attributes:
plyidint

Identificaiton of the composite lamina

matlaminaMatLamina object

A MatLamina object

hfloat

Ply thickness, length

thetadegfloat

Ply angle in degrees

cost, sintfloat

Cosine and sine of the ply angle, dimensionless, computed by rebuild()

cos2t, sin2t, cos4t, sin4tfloat

Cosine and sine of two and four times the ply angle, dimensionless, computed by rebuild()

q11L, q12L, q16L, q22L, q26L, q66Lfloat

Plane-stress stiffnesses of the ply in the laminate axes, force per unit area, computed by rebuild()

q44L, q45L, q55Lfloat

Transverse shear stiffnesses of the ply in the laminate axes, force per unit area, computed by rebuild()

Methods

get_constitutive_matrix()

Return the constitutive matrix

get_transf_matrix_displ_to_lamina()

Return displacement transformation matrix from laminate to lamina

get_transf_matrix_displ_to_laminate()

Deprecated, use get_transf_matrix_displ_to_lamina() instead

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

Builds the symmetric matrix of the ply stiffnesses in the laminate axes computed by rebuild(), [[q11L, q12L, q16L, 0, 0], [q12L, q22L, q26L, 0, 0], [q16L, q26L, q66L, 0, 0], [0, 0, 0, q44L, q45L], [0, 0, 0, q45L, q55L]].

Returns:
Cdouble[:, ::1]

Memoryview of shape (5, 5), force per unit area.

get_transf_matrix_displ_to_lamina()#

Return displacement transformation matrix from laminate to lamina

Builds [[cost, sint, 0], [-sint, cost, 0], [0, 0, 1]] from the terms computed by rebuild(), which maps the displacement components in the laminate axes to those in the material axes of the ply.

Returns:
Tdouble[:, ::1]

Memoryview of shape (3, 3), dimensionless.

Notes

With the ply angle \(\theta\) measured from the laminate \(x\) axis to the material direction 1, as in the stiffnesses of rebuild(), the material direction 1 is \(\{\cos\theta, \sin\theta, 0\}\) in the laminate axes, such that \(\{u_1, u_2, u_3\}^T = T \{u_x, u_y, u_z\}^T\). The matrix is orthogonal, and its transpose maps the material components back to the laminate axes.

get_transf_matrix_displ_to_laminate()#

Deprecated, use get_transf_matrix_displ_to_lamina() instead

Issues a DeprecationWarning and returns the matrix of get_transf_matrix_displ_to_lamina(), which maps the displacements from the laminate axes to the material axes, contrary to what the old name says.

Returns:
Tdouble[:, ::1]

Memoryview of shape (3, 3), dimensionless.

get_transf_matrix_stress_to_lamina()#

Return stress transformation matrix from laminate to lamina

Builds the matrix from the terms cost, sint and sin2t computed by rebuild(), such that \(\{\sigma_{11}, \sigma_{22}, \sigma_{33}, \tau_{23}, \tau_{13}, \tau_{12}\}^T = T \{\sigma_{xx}, \sigma_{yy}, \sigma_{zz}, \tau_{yz}, \tau_{xz}, \tau_{xy}\}^T\), with the material axes 1, 2, 3 and the laminate axes \(x\), \(y\), \(z\).

Returns:
Tdouble[:, ::1]

Memoryview of shape (6, 6), dimensionless.

Notes

With the stress components ordered as \(\{\sigma_{xx}, \sigma_{yy}, \sigma_{zz}, \tau_{yz}, \tau_{xz}, \tau_{xy}\}\), the order of MatLamina.get_constitutive_matrix(), the matrix is the transformation of the stresses from the laminate axes to the material axes for a rotation by the ply angle \(\theta\) about \(z\), e.g. \(\sigma_{11} = \cos^2\theta \sigma_{xx} + \sin^2\theta \sigma_{yy} + \sin 2\theta \tau_{xy}\) [1]. Its inverse, get_transf_matrix_stress_to_laminate(), is the same matrix for \(-\theta\).

References

[1]

Reddy, J. N., Mechanics of Laminated Composite Plates and Shells, CRC Press, 2003. https://doi.org/10.1201/b12409

get_transf_matrix_stress_to_laminate()#

Return stress transformation matrix from lamina to laminate

Builds the matrix from the terms cost, sint and sin2t computed by rebuild(), with the opposite sign of all the terms in sint and sin2t with respect to get_transf_matrix_stress_to_lamina(), such that \(\{\sigma_{xx}, \sigma_{yy}, \sigma_{zz}, \tau_{yz}, \tau_{xz}, \tau_{xy}\}^T = T \{\sigma_{11}, \sigma_{22}, \sigma_{33}, \tau_{23}, \tau_{13}, \tau_{12}\}^T\), with the material axes 1, 2, 3 and the laminate axes \(x\), \(y\), \(z\).

Returns:
Tdouble[:, ::1]

Memoryview of shape (6, 6), dimensionless.

Notes

It is the inverse of get_transf_matrix_stress_to_lamina(), i.e. the transformation of the stresses from the material axes to the laminate axes, obtained by replacing the ply angle \(\theta\) by \(-\theta\).

rebuild()#

Update constitutive matrices

Computes cost, sint, cos2t, sin2t, cos4t and sin4t from thetadeg, and the ply stiffnesses q11L to q55L in the laminate axes from the plane-stress stiffnesses of matlamina in the material axes, which are computed from its e1, e2, nu12, nu21, g12, g13 and g23.

Notes

The plane-stress reduced stiffnesses in the material axes are

\[Q_{11} = \frac{e_1}{1 - \nu_{12}\nu_{21}}, \quad Q_{12} = \frac{\nu_{12} e_2}{1 - \nu_{12}\nu_{21}}, \quad Q_{22} = \frac{e_2}{1 - \nu_{12}\nu_{21}}, \quad Q_{66} = g_{12}, \quad Q_{44} = g_{23}, \quad Q_{55} = g_{13}\]

such that e3, nu13 and nu23 are not used, and thermal expansion is not considered. With \(c = \cos\theta\) and \(s = \sin\theta\), \(\theta\) being the ply angle, the stiffnesses in the laminate axes are [1]:

\[\begin{split}q_{11L} = Q_{11} c^4 + 2 (Q_{12} + 2 Q_{66}) s^2 c^2 + Q_{22} s^4 \\ q_{12L} = (Q_{11} + Q_{22} - 4 Q_{66}) s^2 c^2 + Q_{12} (s^4 + c^4) \\ q_{22L} = Q_{11} s^4 + 2 (Q_{12} + 2 Q_{66}) s^2 c^2 + Q_{22} c^4 \\ q_{16L} = (Q_{11} - Q_{12} - 2 Q_{66}) s c^3 + (Q_{12} - Q_{22} + 2 Q_{66}) s^3 c \\ q_{26L} = (Q_{11} - Q_{12} - 2 Q_{66}) s^3 c + (Q_{12} - Q_{22} + 2 Q_{66}) s c^3 \\ q_{66L} = (Q_{11} + Q_{22} - 2 Q_{12} - 2 Q_{66}) s^2 c^2 + Q_{66} (s^4 + c^4) \\ q_{44L} = Q_{44} c^2 + Q_{55} s^2, \quad q_{45L} = (Q_{55} - Q_{44}) s c, \quad q_{55L} = Q_{55} c^2 + Q_{44} s^2\end{split}\]

References

[1]

Reddy, J. N., Mechanics of Laminated Composite Plates and Shells, CRC Press, 2003. https://doi.org/10.1201/b12409

class composites.core.Laminate#

Laminate, with its stiffnesses and mass integrals

Created with offset = 0, plies = [], stack = [], shear_correction = 'rohwer', scf_k13 = scf_k23 = 5/6 and all other attributes equal to zero. After plies, a list of Lamina objects from the bottom to the top face, and offset are set, calc_constitutive_matrix() computes h, the stiffnesses and the mass integrals, and calc_equivalent_properties() the equivalent moduli. The stiffnesses are thickness integrals of the ply stiffnesses qijL of Lamina, with \(z\) measured from the reference surface. Usually created by laminated_plate(), isotropic_plate() or laminate_from_LaminationParameters().

The object can be pickled: the public attributes and the instance dictionary are saved, and the through-thickness transverse shear distribution used by calc_transverse_shear_stress() is recomputed when needed.

Attributes:
plieslist

List of plies

stacklist

List of angles for each ply

hfloat

Total thickness of the laminate, length

offsetfloat

Offset at the normal direction, length

e1, e2float

Equivalent laminate moduli in directions 1 and 2, force per unit area

g12float

Equivalent laminate shear modulus in the 12 direction, force per unit area

nu12, nu21float

Equivalent laminate Poisson ratios in the 12 and 21 directions, dimensionless

A11, A12, A16, A22, A26, A66float

Membrane stiffnesses \(\int q_{ijL} dz\), force per unit length

B11, B12, B16, B22, B26, B66float

Membrane-bending coupling stiffnesses \(\int q_{ijL} z dz\), force

D11, D12, D16, D22, D26, D66float

Bending stiffnesses \(\int q_{ijL} z^2 dz\), force times length

E11, E12, E16, E22, E26, E66float

Stiffnesses \(\int q_{ijL} z^3 dz\), force times length squared

F11, F12, F16, F22, F26, F66float

Stiffnesses \(\int q_{ijL} z^4 dz\), force times length cubed

H11, H12, H16, H22, H26, H66float

Stiffnesses \(\int q_{ijL} z^6 dz\), force times length to the fifth power

D44, D45, D55float

Transverse shear stiffnesses \(\int q_{ijL} z^2 dz\), force times length, see Dts

F44, F45, F55float

Transverse shear stiffnesses \(\int q_{ijL} z^4 dz\), force times length cubed, see Fts

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(). Force per unit length.

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). Force per unit length.

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)}\). Force per unit length.

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. Dimensionless.

intrhofloat

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

intrhozfloat

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

intrhoz2float

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

intrhoz3float

Integral \(\int_{-h/2+offset}^{+h/2+offset} \rho(z)z^3 dz\), used in the mass matrices of the third-order shear deformation theory (TSDT), mass per unit area times length cubed

intrhoz4float

Integral \(\int_{-h/2+offset}^{+h/2+offset} \rho(z)z^4 dz\), used in the mass matrices of the TSDT, mass per unit area times length to the fourth power

intrhoz6float

Integral \(\int_{-h/2+offset}^{+h/2+offset} \rho(z)z^6 dz\), used in the mass matrices of the TSDT, mass per unit area times length to the sixth power

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

Notes

In the notation of Reddy [1], the stiffnesses relate the stress resultants to the generalized strains of the reference surface, \(\varepsilon^{(0)} = \{\varepsilon_{xx}^{(0)}, \varepsilon_{yy}^{(0)}, \gamma_{xy}^{(0)}\}\) and \(\varepsilon^{(1)} = \{\varepsilon_{xx}^{(1)}, \varepsilon_{yy}^{(1)}, \gamma_{xy}^{(1)}\}\), the in-plane strains being \(\varepsilon^{(0)} + z \varepsilon^{(1)}\). In the CLPT and in the FSDT:

\[\begin{split}\begin{Bmatrix} N \\ M \end{Bmatrix} = \begin{bmatrix} A & B \\ B & D \end{bmatrix} \begin{Bmatrix} \varepsilon^{(0)} \\ \varepsilon^{(1)} \end{Bmatrix}, \qquad \begin{Bmatrix} Q_y \\ Q_x \end{Bmatrix} = A_{ts} \begin{Bmatrix} \gamma_{yz} \\ \gamma_{xz} \end{Bmatrix}\end{split}\]

with \(N = \{N_{xx}, N_{yy}, N_{xy}\}\) and \(M = \{M_{xx}, M_{yy}, M_{xy}\}\), the last relation of the FSDT only, where the constant transverse shear strains through the thickness require the shear correction contained in A44, A45, A55. The TSDT uses as well E, F, H, Dts and Fts, with the uncorrected Abar44, Abar45, Abar55, since the TSDT needs no shear correction. The stiffnesses are computed by calc_constitutive_matrix(). With offset different than zero, the reference surface is not the mid-surface, and B is not zero even for an isotropic plate.

References

[1]

Reddy, J. N., Mechanics of Laminated Composite Plates and Shells, CRC Press, 2003. https://doi.org/10.1201/b12409

A#

Membrane stiffness matrix

Built from the attributes A11 to A66; a new array is returned at each access, such that changing it does not change the attributes.

Returns:
Andarray

Array of shape (3, 3), force per unit length.

ABD#

Stiffness matrix [[A, B], [B, D]]

Built from the attributes A11 to D66; a new array is returned at each access, such that changing it does not change the attributes.

Returns:
ABDndarray

Array of shape (6, 6), with the dimensions of A, B and D.

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). A new array is returned at each access, such that changing it does not change the attributes.

Returns:
Abar_tsndarray

Array of shape (2, 2), force per unit length.

Abarbar_ts#

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

Built from the attributes Abarbar44, Abarbar45, Abarbar55. A new array is returned at each access, such that changing it does not change the attributes.

Returns:
Abarbar_tsndarray

Array of shape (2, 2), force per unit length.

Atrans#

Deprecated, use Ats instead

Returns the same corrected matrix as Ats, issuing a DeprecationWarning.

Returns:
Atransndarray

Array of shape (2, 2), force per unit length.

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(). A new array is returned at each access, such that changing it does not change the attributes.

Returns:
Atsndarray

Array of shape (2, 2), force per unit length.

B#

Membrane-bending coupling stiffness matrix

Built from the attributes B11 to B66; a new array is returned at each access, such that changing it does not change the attributes.

Returns:
Bndarray

Array of shape (3, 3), force.

D#

Bending stiffness matrix

Built from the attributes D11 to D66; a new array is returned at each access, such that changing it does not change the attributes.

Returns:
Dndarray

Array of shape (3, 3), force times length.

Dtrans#

Deprecated, use Dts instead

Returns the same matrix as Dts, issuing a DeprecationWarning.

Returns:
Dtransndarray

Array of shape (2, 2), force times length.

Dts#

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

Built from the attributes D44, D45, D55. A new array is returned at each access, such that changing it does not change the attributes.

Returns:
Dtsndarray

Array of shape (2, 2), force times length.

E#

Stiffness matrix of the third-order shear deformation theory

Built from the attributes E11 to E66; a new array is returned at each access, such that changing it does not change the attributes.

Returns:
Endarray

Array of shape (3, 3), force times length squared.

F#

Stiffness matrix of the third-order shear deformation theory

Built from the attributes F11 to F66; a new array is returned at each access, such that changing it does not change the attributes.

Returns:
Fndarray

Array of shape (3, 3), force times length cubed.

Ftrans#

Deprecated, use Fts instead

Returns the same matrix as Fts, issuing a DeprecationWarning.

Returns:
Ftransndarray

Array of shape (2, 2), force times length cubed.

Fts#

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

Built from the attributes F44, F45, F55. A new array is returned at each access, such that changing it does not change the attributes.

Returns:
Ftsndarray

Array of shape (2, 2), force times length cubed.

H#

Stiffness matrix of the third-order shear deformation theory

Built from the attributes H11 to H66; a new array is returned at each access, such that changing it does not change the attributes.

Returns:
Hndarray

Array of shape (3, 3), force times length to the fifth power.

calc_aposteriori_energy(grad_x, grad_y)#

Transverse shear strain energy of the recovered stresses

With the stresses of calc_equilibrium_transverse_shear() at the three Gauss-Legendre points of each ply, computes at each point the transverse shear strain energies per unit area of reference surface in the directions 13 and 23, and the resultants of the stresses, all integrated through the thickness with three Gauss-Legendre points per ply.

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,). Energy per unit area for U13 and U23, force per unit length for Qy and Qx.

Raises:
ValueError

If a ply has a singular transverse shear constitutive matrix \(C_s^{(k)}\), e.g. g13 = 0 or g23 = 0.

Notes

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) [1], 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, since the recovered stresses are quadratic in \(z\) within each 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. The resultants are \(Q_y = \int \bar\tau_{yz} dz\) and \(Q_x = \int \bar\tau_{xz} dz\).

References

[1]

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

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.

The attributes h, intrho, intrhoz, intrhoz2, intrhoz3, intrhoz4, intrhoz6, A11 to H66, D44, D45, D55, F44, F45 and F55 are computed from plies and offset, with the ply stiffnesses of the last call to Lamina.rebuild() and the density rho of the material of each ply.

Notes

With the plies running from \(z_1 = -h/2 + offset\) to \(z_{N+1} = +h/2 + offset\), the stiffnesses of the CLPT, FSDT and TSDT in the notation of Reddy [1] and the mass integrals are, integrated exactly ply by ply:

\[\begin{split}(A_{ij}, B_{ij}, D_{ij}, E_{ij}, F_{ij}, H_{ij}) = \sum_k \int_{z_k}^{z_{k+1}} q_{ijL}^{(k)} (1, z, z^2, z^3, z^4, z^6) dz, \quad ij = 11, 12, 16, 22, 26, 66 \\ (D_{ij}, F_{ij}) = \sum_k \int_{z_k}^{z_{k+1}} q_{ijL}^{(k)} (z^2, z^4) dz, \quad ij = 44, 45, 55 \\ (intrho, intrhoz, intrhoz2, intrhoz3, intrhoz4, intrhoz6) = \sum_k \int_{z_k}^{z_{k+1}} \rho^{(k)} (1, z, z^2, z^3, z^4, z^6) dz\end{split}\]

and A44, A45, A55 follow from calc_transverse_shear_stiffness().

The mass integrals are the moments of the density through the thickness, \(I_n = \sum_k \int_{z_k}^{z_{k+1}} \rho^{(k)} z^n dz\), required by the kinetic energy \(T = \frac{1}{2} \int_V \rho (\dot{u}^2 + \dot{v}^2 + \dot{w}^2) dV\) of the displacement field of each theory. The in-plane displacements of the CLPT and of the FSDT contain the powers \(z^0\) and \(z\), requiring \(I_0\), \(I_1\), \(I_2\), while those of the TSDT [1] contain \(z^0\), \(z\) and \(z^3\), whose products give the powers \(z^0\) to \(z^4\) and \(z^6\), requiring \(I_0\), \(I_1\), \(I_2\), \(I_3\), \(I_4\), \(I_6\).

References

[1] (1,2)

Reddy, J. N., Mechanics of Laminated Composite Plates and Shells, CRC Press, 2003. https://doi.org/10.1201/b12409

calc_equilibrium_transverse_shear(grad_x, grad_y, z=None)#

Transverse shear stresses recovered from the actual strain gradients

Integrates through the thickness, from the bottom face, the equilibrium of the in-plane stresses of the plies given by the derivatives grad_x and grad_y of the generalized strains, e.g. those of an FSDT solution, at npts points, and returns the transverse shear stresses at the heights z. The stresses vanish at the bottom face; at the top face they do not vanish in general.

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. The first three entries are per unit length and the last three per unit length squared.

zarray-like or None, optional

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

Returns:
z, tau_yz, tau_xznp.ndarray

The heights, with shape (nz,), and the stresses, with shape (npts, nz). With z=None, nz is three times the number of plies. Length for z and force per unit area for the stresses.

Raises:
ValueError

If a value of z is outside the laminate.

Notes

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) [1], 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. The integrals of each ply are computed exactly by _equilibrium_integrals(), with \(z\) measured from the mid-surface and the gradients \(\varepsilon^{(0)}\) shifted by offset times \(\varepsilon^{(1)}\), which avoids the round-off of large values of offset.

References

[1]

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

calc_equivalent_properties()#

Calculate the equivalent laminate properties

The following attributes are updated:

e1, e2, g12, nu12, nu21

They are computed from the inverse of the 6x6 ABD matrix and from h.

Notes

With \(a = [[A, B], [B, D]]^{-1}\), whose upper-left 3x3 block is the membrane compliance of the laminate with zero moments and free curvatures:

\[e_1 = \frac{1}{h a_{11}}, \quad e_2 = \frac{1}{h a_{22}}, \quad g_{12} = \frac{1}{h a_{66}}, \quad \nu_{12} = -\frac{a_{12}}{a_{11}}, \quad \nu_{21} = -\frac{a_{12}}{a_{22}}\]

where the index 6 is the third row and column of \(a\).

calc_lamination_parameters()#

Calculate the lamination parameters.

The following attributes are calculated:

xiA, xiB, xiD, xiAts

They are the attributes of the returned object, computed from the ply angles and from the ply heights measured from the reference surface, i.e. including offset, divided by the total thickness. The object is not modified, except that Lamina.rebuild() is called for each ply.

Returns:
lpLaminationParameters

New object with the lamination parameters, dimensionless.

Raises:
ValueError

If there are no plies.

Notes

With \(\bar{z} = z/h\), \(z\) measured from the reference surface, and \(\theta(\bar{z})\) the ply angle:

\[\begin{split}\{\xi_{A1}, \xi_{A2}, \xi_{A3}, \xi_{A4}\} = \int \{\cos 2\theta, \sin 2\theta, \cos 4\theta, \sin 4\theta\} d\bar{z} \\ \{\xi_{B1}, \xi_{B2}, \xi_{B3}, \xi_{B4}\} = 4 \int \{\cos 2\theta, \sin 2\theta, \cos 4\theta, \sin 4\theta\} \bar{z} d\bar{z} \\ \{\xi_{D1}, \xi_{D2}, \xi_{D3}, \xi_{D4}\} = 12 \int \{\cos 2\theta, \sin 2\theta, \cos 4\theta, \sin 4\theta\} \bar{z}^2 d\bar{z} \\ \{\xi_{A_{ts}1}, \xi_{A_{ts}2}\} = \int \{\cos 2\theta, \sin 2\theta\} d\bar{z}\end{split}\]

integrated exactly ply by ply, such that xiAts1 = xiA1 and xiAts2 = xiA2. With these definitions, the stiffnesses of the laminate are linear in the lamination parameters, see laminate_from_LaminationParameters().

The \(\xi_{Ai}\) and \(\xi_{Di}\) are those of Krupa et al. [1], who integrate from \(z = -h/2\) to \(z = h/2\), i.e. with offset = 0. The \(\xi_{Bi}\) and \(\xi_{A_{ts}i}\), not defined there, follow the same pattern, with the factor 4 of \(\xi_{Bi}\) corresponding to the factor \(h^2/4\) of \(B_{ij}\) in laminate_from_LaminationParameters().

References

[1]

Krupa, E. P., Cooper, J. E., Pirrera, A. and Nangia, R., Improved aerostructural performance via aeroservoelastic tailoring of a composite wing, The Aeronautical Journal, 122 (1255), 1442-1474, 2018. https://doi.org/10.1017/aer.2018.66

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.

The method is selected by the attribute shear_correction:

  • 'rohwer' (default): equilibrium approach, giving the full 2x2 matrix.

  • 'vlachoutsis': the scalar factors k13, k23 are applied to the constant-strain stiffness, A55 = k13*Abar55, A44 = k23*Abar44, and A45 = (k13 + k23)/2*Abar45.

  • 'whitney': the result is identical to 'vlachoutsis'.

  • 'chow': for laminates symmetric about the mid-surface only, for which the result is identical to 'vlachoutsis'.

  • 'birman_bert': average shear strain factors, applied as in 'vlachoutsis'. It gives \(k = 1\) for a homogeneous plate.

  • 'thickness_shear': dynamic factors, 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.

Without plies, A44, A45, A55, Abar44, Abar45, Abar55, Abarbar44, Abarbar45 and Abarbar55 are set to zero and nothing else is updated.

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'). Also if the transverse shear compliance obtained with 'rohwer' is singular, or if the sum of q11L (direction 1) or q22L (direction 2) times the ply thicknesses is not positive ('vlachoutsis', 'whitney', 'chow', 'birman_bert').

Notes

All of the methods are evaluated with \(z\) measured from the mid-surface, which avoids the round-off of large values of offset. The constant-strain stiffness \(\bar{A}_{ts} = \sum_k C_s^{(k)} h_k\) corresponds to transverse shear strains constant through the thickness, and the constant-stress stiffness \(\bar{\bar{A}}_{ts} = h^2 [\sum_k (C_s^{(k)})^{-1} h_k]^{-1}\) to the constant stresses \(\{\tau_{yz}, \tau_{xz}\} = \{Q_y, Q_x\}/h\), with the same complementary energy.

  • 'rohwer': equilibrium approach of Rohwer (1988) [1]. 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\), see _calc_transverse_shear_distribution(). 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) [2] 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. For the direction 1, with \(C_{11} = q_{11L}\) and \(C_{55} = q_{55L}\) of each ply:

    \[z_n = \frac{\int C_{11} z dz}{\int C_{11} dz}, \quad R = \int C_{11} (z - z_n)^2 dz, \quad g(z) = -\int_{z_1}^{z} C_{11} (\bar{z} - z_n) d\bar{z}, \quad k_{13} = \frac{R^2}{\bar{A}_{55} \int g^2/C_{55} dz}\]

    i.e. the energy of the transverse shear stress \(\tau_{xz} = Q_x g(z)/R\) of the one-dimensional equilibrium \(\tau_{xz,z} = -\sigma_{xx,x}\) is equated with that of the FSDT, \(Q_x^2/(k_{13} \bar{A}_{55})\). Analogously for \(k_{23}\) with \(C_{22} = q_{22L}\), \(C_{44} = q_{44L}\) and \(\bar{A}_{44}\). The integrals of \(g\) are evaluated with three Gauss-Legendre points per ply, which is exact, \(g^2\) being a polynomial of degree 4 within each ply.

  • 'whitney': the scalar factors of Whitney (1973) [3], Eqs. (3)-(7), extending Chow (1971) [4] to unsymmetric orthotropic laminates in cylindrical bending. The derivative of the bending stress, Eq. (3), \(\sigma_{xx,x} = -C_{11}(B_{11} - A_{11}z) Q_x/(D_{11}A_{11} - B_{11}^2)\), vanishes at the neutral surface \(z_n = B_{11}/A_{11}\) and, since \(R = (D_{11}A_{11} - B_{11}^2)/A_{11}\), equals \(C_{11}(z - z_n) Q_x/R\). Integrated with the equilibrium \(\sigma_{xx,x} + \tau_{xz,z} = 0\), Eq. (4), it gives the \(\tau_{xz}\) of 'vlachoutsis', Eq. (5), and the energy equivalence, Eqs. (6)-(7), gives the same \(k_{13}\). The result is identical to 'vlachoutsis'.

  • 'chow': the scalar factors of Chow (1971) [4], 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, see _check_symmetric(). 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) [5], 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) [6], as described by Sun and Whitney (1973) [7], extending the criterion of Mindlin (1951) [8] 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, see _thickness_shear_frequency(). The rotatory inertia about the centre of mass, \(\bar{I}_2 = I_2 - I_1^2/I_0\), with \(I_n = \int \rho z^n dz\), 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\), the factor that 'rohwer', 'vlachoutsis', 'whitney' and 'chow' give for a homogeneous plate.

References

[1]

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

[2]

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

[3]

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

[4] (1,2)

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, 5, 306-319, 1971.

[5]

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

[6]

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

[7]

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

[8]

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

calc_transverse_shear_stress(z, Qy, Qx)#

Transverse shear stresses at a given height

Evaluates, for the transverse shear forces Qy and Qx, the through-thickness distribution of the transverse shear stresses of the equilibrium approach used by shear_correction='rohwer', see calc_transverse_shear_stiffness(), which is quadratic within each ply, vanishes at the bottom and top faces and is continuous at the ply interfaces, e.g. for failure criteria.

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.

Notes

Evaluates the equilibrium distribution of Rohwer (1988) [1], see _calc_transverse_shear_distribution():

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

References

[1]

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

make_balanced()#

Make a balanced laminate

The attributes A16, A26, Abar45 and Abarbar45, and A45 unless shear_correction='rohwer', are set to zero to make a balanced laminate. Abarbar45 is kept when it is nan, i.e. when a ply has a singular \(C_s^{(k)}\). The other attributes are not modified, among them B16, B26, D16, D26, E16, E26, F16, F26, H16, H26, D45 and F45, which do not vanish in a balanced laminate in general, e.g. B16 and B26 of an antisymmetric \([+45/-45]\) laminate.

Raises:
RuntimeError

If offset is not zero.

Notes

In a balanced laminate, for every ply at \(+\theta\) there is a ply at \(-\theta\) of the same material and thickness, anywhere in the stack. \(q_{16L}\), \(q_{26L}\) and \(q_{45L}\) are odd functions of the ply angle and the other \(q_{ijL}\) are even, see Lamina.rebuild(). The contributions of such a pair of plies, of thickness \(t\) and with bottom faces at \(z_a\) and \(z_b\), to the integral of \(q_{16L} z^n\) add up to

\[q_{16L}(\theta) \int_{z_a}^{z_a + t} z^n dz + q_{16L}(-\theta) \int_{z_b}^{z_b + t} z^n dz = q_{16L}(\theta) \left( \int_{z_a}^{z_a + t} z^n dz - \int_{z_b}^{z_b + t} z^n dz \right)\]

which vanishes for any \(z_a\), \(z_b\) only for \(n = 0\), see calc_constitutive_matrix(). Therefore, \(A_{16}\), \(A_{26}\) and \(\bar{A}_{45} = \sum_k q_{45L}^{(k)} h_k\) vanish in every balanced laminate, whereas the integrals with \(n \ge 1\), \(B_{16}\) to \(H_{26}\), \(D_{45}\) and \(F_{45}\), are proportional to \(z_a - z_b\) and depend on the positions of the plies. The determinant of \(C_s^{(k)}\) being even in \(\theta\), the off-diagonal term of \((C_s^{(k)})^{-1}\) is odd, its thickness integral vanishes and so does \(\bar{\bar{A}}_{45}\). A45 is proportional to Abar45 for every shear_correction other than 'rohwer', see calc_transverse_shear_stiffness(), and vanishes with it. With 'rohwer', A45 follows from the through-thickness distribution of the transverse shear stresses, which depends on the positions of the plies and on the whole ABD matrix, and does not vanish in general, e.g. for a \([+30/-30/0]_s\) laminate, even with g13 = g23, i.e. \(q_{45L} = 0\) in every ply.

make_orthotropic()#

Make an orthotropic laminate

The attributes A16, A26, B16, B26, D16, D26, E16, E26, F16, F26, H16, H26 and the transverse shear couplings A45, Abar45, Abarbar45, D45, F45 are set to zero to make an orthotropic laminate. Abarbar45 is kept when it is nan, i.e. when a ply has a singular \(C_s^{(k)}\), as in make_balanced(). The other attributes are not modified.

Raises:
RuntimeError

If offset is not zero.

Notes

These terms vanish in a laminate whose plies are all at 0 or 90 degrees, for which \(q_{16L} = q_{26L} = q_{45L} = 0\), see Lamina.rebuild(). The terms \(ij = 16, 26\) of \(A_{ij}\) to \(H_{ij}\) and \(D_{45}\), \(F_{45}\), \(\bar{A}_{45}\) are thickness integrals of \(q_{16L}\), \(q_{26L}\) and \(q_{45L}\), see calc_constitutive_matrix() and calc_transverse_shear_stiffness(), and \(\bar{\bar{A}}_{45}\) vanishes with the diagonal \(C_s^{(k)}\) of every ply. With every ply diagonal and the ABD matrix decoupled between \(\{N_{xx}, N_{yy}, M_{xx}, M_{yy}\}\) and \(\{N_{xy}, M_{xy}\}\), the transverse shear distribution of 'rohwer' is diagonal, and A45 vanishes for every shear_correction.

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.

Raises:
NotImplementedError

If offset is not zero.

Notes

\(D_{ij} = h^2 A_{ij}/12\) and \(B_{ij} = 0\) are the stiffnesses of a homogeneous plate with the in-plane stiffnesses \(A_{ij}/h\), i.e. of a laminate whose plies are smeared through the thickness, the limit of many repetitions of the stacking sequence.

make_symmetric()#

Make a symmetric laminate

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

The attributes E11 to E66 of the TSDT are also set to zero. The other attributes are not modified.

Raises:
RuntimeError

If offset is not zero.

Notes

In a laminate symmetric about its mid-surface the integrands of the odd powers of \(z\) are odd functions of \(z\), see calc_constitutive_matrix(), such that \(B_{ij} = E_{ij} = 0\), \(ij = 11, 12, 16, 22, 26, 66\), the integrals of \(z\) and \(z^3\). The integrands of the even powers of \(z\), i.e. of \(A_{ij}\), \(D_{ij}\), \(F_{ij}\), \(H_{ij}\) and of the transverse shear terms \(D_{ij}\), \(F_{ij}\), \(ij = 44, 45, 55\), are even functions of \(z\), which the symmetry does not make zero.

class composites.core.LaminationParameters#

Lamination parameters

Container of the 14 lamination parameters, all dimensionless and initialized to zero. It is returned by Laminate.calc_lamination_parameters() and used by laminate_from_LaminationParameters() and GradABD.calc_LP_grad(). The deprecated properties xiAtrans1 and xiAtrans2 are aliases of xiAts1 and xiAts2.

Attributes:
xiA1, xiA2, xiA3, xiA4float

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

xiB1, xiB2, xiB3, xiB4float

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

xiD1, xiD2, xiD3, xiD4float

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

xiAts1, xiAts2float

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

Notes

The lamination parameters are defined in Laminate.calc_lamination_parameters(), and the stiffnesses that they give in laminate_from_LaminationParameters().

xiAtrans1#

Deprecated, use xiAts1 instead

Issues a DeprecationWarning and returns xiAts1.

Returns:
xiAts1float

Lamination parameter \(\xi_{A_{ts}1}\), dimensionless.

xiAtrans2#

Deprecated, use xiAts2 instead

Issues a DeprecationWarning and returns xiAts2.

Returns:
xiAts2float

Lamination parameter \(\xi_{A_{ts}2}\), dimensionless.

class composites.core.MatLamina#

Orthotropic material lamina

Container of the elastic, thermal, density and strength properties of a material, created with all attributes equal to zero. After the elastic properties are set, rebuild() computes the constitutive constants q11 to q66, the stiffness constants c11 to c66 and the invariants u1 to u7, all with the dimension of force per unit area; trace_normalize_plane_stress() divides some of them by the trace, such that they become dimensionless. Usually created by read_laminaprop().

Attributes:
e1float

Young Modulus in direction 1, force per unit area

e2float

Young Modulus in direction 2, force per unit area

e3float

Young Modulus in direction 3, force per unit area

g12float

in-plane shear modulus, force per unit area

g13float

transverse shear modulus for plane 1-Z, force per unit area

g23float

transverse shear modulus for plane 2-Z, force per unit area

nu12float

Poisson’s ratio 12, dimensionless

nu13float

Poisson’s ratio 13, dimensionless

nu23float

Poisson’s ratio 23, dimensionless

nu21float

Poisson’s ratio 21: use formula nu12/e1 = nu21/e2, dimensionless

nu31float

Poisson’s ratio 31: use formula nu31/e3 = nu13/e1, dimensionless

nu32float

Poisson’s ratio 32: use formula nu23/e2 = nu32/e3, dimensionless

rhofloat

especific mass (mass / volume)

a1float

thermal expansion coeffiecient in direction 1, per unit temperature

a2float

thermal expansion coeffiecient in direction 2, per unit temperature

a3float

thermal expansion coeffiecient in direction 3, per unit temperature

treffloat

reference temperature

st1,st2float

allowable tensile stresses for directions 1 and 2, force per unit area

sc1,sc2float

allowable compressive stresses for directions 1 and 2, force per unit area

ss12float

allowable in-plane stress for shear, force per unit area

q11float

lamina constitutive constant 11

q12float

lamina constitutive constant 12

q13float

lamina constitutive constant 13

q21float

lamina constitutive constant 21

q22float

lamina constitutive constant 22

q23float

lamina constitutive constant 23

q31float

lamina constitutive constant 31

q32float

lamina constitutive constant 32

q33float

lamina constitutive constant 33

q44float

lamina constitutive constant 44

q55float

lamina constitutive constant 55

q66float

lamina constitutive constant 66

c11, c12, c13, c22, c23, c33, c44, c55, c66float

lamina stiffness constants

u1, u2, u3, u4, u5, u6, u7float

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

MatLamina recomputes neither \(G\) nor \(E\): rebuild() uses the moduli and the Poisson’s ratios as they are set. For an isotropic material given as laminaprop = (e, nu), read_laminaprop() sets g12 = g13 = g23 = e/(2*(1 + nu)), i.e. \(G = E/(2(1 + \nu))\); with 6 or 9 entries of laminaprop the shear moduli are taken as given. Otherwise, the user must set the shear moduli consistently with \(E\) and \(\nu\).

get_constitutive_matrix()#

Return the constitutive matrix

Builds the symmetric matrix of the stiffness constants c11 to c66 computed by rebuild(), with the rows and columns ordered as 11, 22, 33, 23, 13, 12 (c44 = g23, c55 = g13, c66 = g12).

Returns:
Cdouble[:, ::1]

Memoryview of shape (6, 6), force per unit area.

get_invariant_matrix()#

Return the invariant matrix

Builds the matrix of the invariants u1 to u7 computed by rebuild(). The rows correspond to q11, q22, q12, q66, q16, q26, q44, q45, q55 and the columns to the factors of 1 and of the lamination parameters, in the same combinations used by laminate_from_LaminationParameters().

Returns:
Udouble[:, ::1]

Memoryview of shape (9, 5), force per unit area.

Notes

The stiffnesses of a ply at the angle \(\theta\) in the laminate axes, see Lamina.rebuild(), are linear in \(\cos 2\theta\), \(\sin 2\theta\), \(\cos 4\theta\) and \(\sin 4\theta\), with the invariants of rebuild() as coefficients [1]:

\[\{q_{11L}, q_{22L}, q_{12L}, q_{66L}, q_{16L}, q_{26L}, q_{44L}, q_{45L}, q_{55L}\}^T = U \{1, \cos 2\theta, \sin 2\theta, \cos 4\theta, \sin 4\theta\}^T\]

which holds when u1 to u5 are computed from the plane-stress reduced stiffnesses, i.e. with e3 = 0. Integrated through the thickness, the trigonometric terms give the lamination parameters, see laminate_from_LaminationParameters().

References

[1]

Jones, R. M., Mechanics of Composite Materials, Second Edition, Taylor & Francis, Philadelphia, 1999.

rebuild()#

Update constitutive and invariant terms

Computes, from the moduli e1, e2, e3, g12, g13, g23 and the Poisson’s ratios nu12, nu21, nu13, nu31, nu23, nu32, the stiffness constants c11 to c66, the constitutive constants q11 to q66 and the invariants u1 to u7, with the dimension of force per unit area. e1 and e2 must be non-zero.

Notes

With \(\Delta = 1 - \nu_{12}\nu_{21} - \nu_{13}\nu_{31} - \nu_{23}\nu_{32} - \nu_{12}\nu_{23}\nu_{31} - \nu_{13}\nu_{21}\nu_{32}\), the constitutive constants are the stiffnesses of the orthotropic material in its principal axes [2]:

\[\begin{split}q_{11} = e_1 (1 - \nu_{23}\nu_{32})/\Delta, \quad q_{12} = e_1 (\nu_{21} + \nu_{23}\nu_{31})/\Delta, \quad q_{13} = e_1 (\nu_{31} + \nu_{21}\nu_{32})/\Delta \\ q_{21} = e_2 (\nu_{12} + \nu_{13}\nu_{32})/\Delta, \quad q_{22} = e_2 (1 - \nu_{13}\nu_{31})/\Delta, \quad q_{23} = e_2 (\nu_{32} + \nu_{12}\nu_{31})/\Delta \\ q_{31} = e_3 (\nu_{13} + \nu_{12}\nu_{23})/\Delta, \quad q_{32} = e_3 (\nu_{23} + \nu_{13}\nu_{21})/\Delta, \quad q_{33} = e_3 (1 - \nu_{12}\nu_{21})/\Delta \\ q_{44} = g_{23}, \quad q_{55} = g_{13}, \quad q_{66} = g_{12}\end{split}\]

which are symmetric, \(q_{ij} = q_{ji}\), when the Poisson’s ratios satisfy the reciprocity \(\nu_{ij}/e_i = \nu_{ji}/e_j\), see read_laminaprop(); the matrix of \(q_{ij}\), \(i, j = 1, 2, 3\), is then the inverse of the upper-left block of the compliance matrix given below. With \(e_3 = 0\), as given by read_laminaprop() for 2 or 6 entries, \(\nu_{31} = \nu_{32} = 0\) and \(q_{11}\), \(q_{12}\), \(q_{22}\) are the plane-stress reduced stiffnesses \(e_1/(1 - \nu_{12}\nu_{21})\), \(e_1 \nu_{21}/(1 - \nu_{12}\nu_{21})\) and \(e_2/(1 - \nu_{12}\nu_{21})\) used by Lamina.rebuild().

The stiffness constants are computed with \(\delta = (1 - \nu_{12}\nu_{21} - \nu_{23}\nu_{32} - \nu_{31}\nu_{13} - 2\nu_{21}\nu_{32}\nu_{13})/(e_1 e_2)\) [1]:

\[\begin{split}c_{11} = (1 - \nu_{23}\nu_{32})/(\delta e_2), \quad c_{12} = (\nu_{21} + \nu_{31}\nu_{23})/(\delta e_2), \quad c_{13} = (\nu_{31} + \nu_{21}\nu_{32})/(\delta e_2) \\ c_{22} = (1 - \nu_{13}\nu_{31})/(\delta e_1), \quad c_{23} = (\nu_{32} + \nu_{12}\nu_{31})/(\delta e_1), \quad c_{33} = e_3 (1 - \nu_{12}\nu_{21})/(\delta e_1 e_2) \\ c_{44} = g_{23}, \quad c_{55} = g_{13}, \quad c_{66} = g_{12}\end{split}\]

With the reciprocity, \(\delta e_1 e_2 = \Delta\) and \(c_{ij} = q_{ij}\). The matrix of the stiffness constants, see get_constitutive_matrix(), is then the inverse of the orthotropic compliance matrix, with \(S_{11} = 1/e_1\), \(S_{22} = 1/e_2\), \(S_{33} = 1/e_3\), \(S_{12} = -\nu_{12}/e_1\), \(S_{13} = -\nu_{13}/e_1\), \(S_{23} = -\nu_{23}/e_2\), \(S_{44} = 1/g_{23}\), \(S_{55} = 1/g_{13}\) and \(S_{66} = 1/g_{12}\) [1].

The invariants \(u_1\) to \(u_5\) are those of Jones [3], and \(u_6\), \(u_7\) the transverse shear invariants of the ABAQUS manual [4]:

\[\begin{split}u_1 = (3 q_{11} + 3 q_{22} + 2 q_{12} + 4 q_{66})/8, \quad u_2 = (q_{11} - q_{22})/2 \\ u_3 = (q_{11} + q_{22} - 2 q_{12} - 4 q_{66})/8, \quad u_4 = (q_{11} + q_{22} + 6 q_{12} - 4 q_{66})/8 \\ u_5 = (u_1 - u_4)/2, \quad u_6 = (q_{44} + q_{55})/2, \quad u_7 = (q_{44} - q_{55})/2\end{split}\]

They give the stiffnesses of a ply at any angle, see get_invariant_matrix().

The intended use is plane stress, with the default \(e_3 = 0\) of read_laminaprop() for 2 or 6 entries: \(q_{11}\), \(q_{12}\), \(q_{22}\) are then the plane-stress reduced stiffnesses also used by Lamina.rebuild(), and the invariants give the plane-stress stiffnesses \(q_{ijL}\) of the ply in the laminate axes. With \(e_3 \ne 0\), \(q_{11}\), \(q_{12}\), \(q_{22}\) are the three-dimensional stiffnesses \(c_{11}\), \(c_{12}\), \(c_{22}\), and the invariants give the components 11, 22, 12, 66, 16, 26, 44, 45 and 55 of the three-dimensional stiffness matrix of get_constitutive_matrix() rotated by the ply angle about the 3 axis, which differ from the plane-stress \(q_{ijL}\) of Lamina.rebuild(). This is meant to compute three-dimensional properties, e.g. for continuum shell elements integrated with a user material (UMAT).

References

[1] (1,2)

Reddy, J. N., Mechanics of Laminated Composite Plates and Shells, CRC Press, 2003. https://doi.org/10.1201/b12409

[2]

Gürdal, Z., Haftka, R. T. and Hajela, P., Design and Optimization of Laminated Composite Materials, Wiley-Interscience, 1999.

[3]

Jones, R. M., Mechanics of Composite Materials, Second Edition, Taylor & Francis, Philadelphia, 1999.

[4]

ABAQUS Example Problems Manual, Vol. 1, Example 1.2.2, Laminated composite shell: buckling of a cylindrical panel with a circular hole.

trace_normalize_plane_stress()#

Trace-normalize the lamina properties for plane stress

Modify the original MatLamina object with a trace-normalization: the constitutive constants q11, q12, q22, q44, q55, q66 and the invariants u1 to u7 are divided by the trace tr = q11 + q22 + 2*q66, such that they become dimensionless trace-normalized values. These can be accessed using the same attributes. The other attributes are not modified.

Notes

The trace is calculated according to Eq. 1 of Melo et al. [1], \(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; since the invariants are linear in the stiffnesses, they are divided by \(tr\) as well. The trace does not depend on the ply angle, since \(q_{11L} + q_{22L} + 2 q_{66L} = 2(u_1 + u_5)\), see get_invariant_matrix().

References

[1]

Melo, J. D. D., Bi, J., and Tsai, S. W., A Novel Invariant-Based Design Approach to Carbon Fiber Reinforced Laminates, Composite Structures, 159, 44-52, 2017.

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

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

In a new Laminate object, the stiffnesses A11 to D66 and Abar44, Abar45, Abar55 are computed from thickness, from the invariants u1 to u7 of mat and from the lamination parameters of lp, with the combinations of MatLamina.get_invariant_matrix(). No plies are created, offset is zero, and the mass integrals intrho, intrhoz, intrhoz2, intrhoz3, intrhoz4, intrhoz6 and the equivalent properties e1, e2, g12, nu12, nu21 are not computed, remaining zero. The stiffnesses E11 to H66, D44, D45, D55, F44, F45 and F55 are also zero. The transverse shear stiffnesses A44, A45, A55 are 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.

Parameters:
thicknessfloat

The total thickness of the laminate, length

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

The stiffnesses of a ply are linear in the trigonometric functions of its angle, with the invariants of mat as coefficients, see MatLamina.get_invariant_matrix(), and the lamination parameters are their thickness integrals, see Laminate.calc_lamination_parameters(). For a laminate of a single material, with \(h\) = thickness, \(\int dz = h \int d\bar{z}\), \(\int z dz = h^2/4 \cdot 4\int \bar{z} d\bar{z}\) and \(\int z^2 dz = h^3/12 \cdot 12 \int \bar{z}^2 d\bar{z}\) give:

\[\begin{split}A_{11} = h (u_1 + u_2 \xi_{A1} + u_3 \xi_{A3}), \quad A_{12} = h (u_4 - u_3 \xi_{A3}), \quad A_{22} = h (u_1 - u_2 \xi_{A1} + u_3 \xi_{A3}) \\ A_{16} = h (u_2/2 \, \xi_{A2} + u_3 \xi_{A4}), \quad A_{26} = h (u_2/2 \, \xi_{A2} - u_3 \xi_{A4}), \quad A_{66} = h (u_5 - u_3 \xi_{A3}) \\ B_{11} = \frac{h^2}{4} (u_2 \xi_{B1} + u_3 \xi_{B3}), \quad B_{12} = -\frac{h^2}{4} u_3 \xi_{B3}, \quad B_{22} = \frac{h^2}{4} (-u_2 \xi_{B1} + u_3 \xi_{B3}) \\ B_{16} = \frac{h^2}{4} (u_2/2 \, \xi_{B2} + u_3 \xi_{B4}), \quad B_{26} = \frac{h^2}{4} (u_2/2 \, \xi_{B2} - u_3 \xi_{B4}), \quad B_{66} = -\frac{h^2}{4} u_3 \xi_{B3} \\ \bar{A}_{44} = h (u_6 + u_7 \xi_{A_{ts}1}), \quad \bar{A}_{45} = -h u_7 \xi_{A_{ts}2}, \quad \bar{A}_{55} = h (u_6 - u_7 \xi_{A_{ts}1})\end{split}\]

and \(D_{ij}\) as \(A_{ij}\), with the factor \(h^3/12\) instead of \(h\) and \(\xi_{Di}\) instead of \(\xi_{Ai}\). Since the through-thickness distribution of the plies is not known from the lamination parameters, no shear correction can be computed, hence the uncorrected transverse shear stiffnesses.

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

The 14 lamination parameters according to the first-order shear deformation theory are \(\xi_{A1} \cdots \xi_{A4}\), \(\xi_{B1} \cdots \xi_{B4}\), \(\xi_{D1} \cdots \xi_{D4}\), \(\xi_{A_{ts}1}\) and \(\xi_{A_{ts}2}\). They are stored in a new LaminationParameters object, passed to laminate_from_LaminationParameters().

Parameters:
thicknessfloat

The total thickness of the laminate, length

matlaminaMatLamina object

Material object

xiA1, xiA2, xiA3, xiA4float

Lamination parameters \(\xi_{A1} \cdots \xi_{A4}\), dimensionless.

xiB1, xiB2, xiB3, xiB4float

Lamination parameters \(\xi_{B1} \cdots \xi_{B4}\), dimensionless.

xiD1, xiD2, xiD3, xiD4float

Lamination parameters \(\xi_{D1} \cdots \xi_{D4}\), dimensionless.

xiAts1, xiAts2float, optional

Lamination parameters \(\xi_{A_{ts}1}\) and \(\xi_{A_{ts}2}\), dimensionless. Default 0.

xiAtrans1, xiAtrans2float, optional

Deprecated, use xiAts1 and xiAts2 instead. Default None; when not None, the value replaces xiAts1 or xiAts2 and a DeprecationWarning is issued.

Returns:
lamLaminate

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

Notes

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}\), since they multiply the invariant \(u_7 = (q_{44} - q_{55})/2 = (g_{23} - g_{13})/2\), see laminate_from_LaminationParameters().

composites.core.make_balanced_LP(lp)#

Make balanced lamination parameters

The lamination parameters \(\xi_{A2}\), \(\xi_{A4}\) and \(\xi_{A_{ts}2}\) are set to null to make a balanced laminate. The other lamination parameters are not modified, among them \(\xi_{B2}\), \(\xi_{B4}\), \(\xi_{D2}\) and \(\xi_{D4}\), which do not vanish in a balanced laminate in general.

The object lp is modified in place and returned.

Parameters:
lpLaminationParameters

Lamination parameters, modified in place.

Returns:
lpLaminationParameters

The same object given as input.

Notes

In a balanced laminate, with a ply at \(-\theta\) for every ply at \(+\theta\) of the same material and thickness, anywhere in the stack, the thickness integrals of the odd functions \(\sin 2\theta\) and \(\sin 4\theta\) vanish, see Laminate.calc_lamination_parameters(), and so do \(A_{16}\), \(A_{26}\) and \(\bar{A}_{45}\), see Laminate.make_balanced(). The integrals weighted by \(\bar{z}\) and \(\bar{z}^2\), \(\xi_{B2}\), \(\xi_{B4}\), \(\xi_{D2}\) and \(\xi_{D4}\), depend on the positions of the plies, e.g. \(\xi_{B2} \ne 0\) for an antisymmetric \([+45/-45]\) laminate.

composites.core.make_orthotropic_LP(lp)#

Make orthotropic lamination parameters

The lamination parameters \(\xi_{A2}\), \(\xi_{A4}\), \(\xi_{B2}\), \(\xi_{B4}\), \(\xi_{D2}\), \(\xi_{D4}\) and \(\xi_{A_{ts}2}\) are set to null to make an orthotropic laminate.

The object lp is modified in place and returned.

Parameters:
lpLaminationParameters

Lamination parameters, modified in place.

Returns:
lpLaminationParameters

The same object given as input.

Notes

The lamination parameters of the sine terms give the stiffnesses \(A_{16}\), \(A_{26}\), \(B_{16}\), \(B_{26}\), \(D_{16}\), \(D_{26}\) and \(\bar{A}_{45}\), see laminate_from_LaminationParameters(), and they vanish when all plies are at 0 or 90 degrees, see Laminate.make_orthotropic(). 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.

The object lp is modified in place and returned.

Parameters:
lpLaminationParameters

Lamination parameters, modified in place.

Returns:
lpLaminationParameters

The same object given as input.

Notes

In a laminate symmetric about its mid-surface, the integrands of \(\xi_{Bi}\), linear in \(\bar{z}\), are odd functions of \(\bar{z}\), see Laminate.calc_lamination_parameters(), such that \(\xi_{Bi} = 0\) and the coupling stiffnesses \(B_{ij}\) vanish.

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

In a new Laminate object, the stiffnesses A11 to A66 and D11 to D66 are computed from thickness, from the trace and the trace-normalized invariants of matlamina and from the first n angles of angles_deg. The object matlamina is modified in place by MatLamina.trace_normalize_plane_stress(). No plies are created, stack is empty, all the other stiffnesses are zero and Laminate.calc_equivalent_properties() is called.

An N-double laminate consists of \([\pm\phi_1,\pm\phi_2, \cdots, \pm\phi_n]\).

Parameters:
thicknessfloat

Total plate thickness, length.

nint

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

angles_deg1-D array of float64

List of \(\phi_n\) of the N-double laminate. C-contiguous array of size at least n, of which the first n angles are used, in degrees.

matlaminaMatLamina

See MatLamina for details. Modified in place.

Returns:
lamLaminate

The N-double laminate.

Notes

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 et al. [1]. The plies at \(\pm\phi_i\) have the same thickness, such that the stiffnesses are the averages of the ply stiffnesses of MatLamina.get_invariant_matrix() over the \(2n\) angles, written with the trace \(tr\) and the trace-normalized invariants \(u_i^*\) of MatLamina.trace_normalize_plane_stress() [2]:

\[\begin{split}A_{11}^* = u_1^* + \frac{1}{n} \sum_{i=1}^{n} \left( u_2^* \cos 2\phi_i + u_3^* \cos 4\phi_i \right), \quad A_{22}^* = u_1^* + \frac{1}{n} \sum_{i=1}^{n} \left( -u_2^* \cos 2\phi_i + u_3^* \cos 4\phi_i \right) \\ A_{12}^* = u_4^* - \frac{1}{n} \sum_{i=1}^{n} u_3^* \cos 4\phi_i, \quad A_{66}^* = u_5^* - \frac{1}{n} \sum_{i=1}^{n} u_3^* \cos 4\phi_i, \quad A_{16}^* = A_{26}^* = 0 \\ A_{ij} = tr \, A_{ij}^* h, \qquad D_{ij} = tr \, A_{ij}^* h^3/12\end{split}\]

where the bending stiffnesses are those of the homogenized laminate, see Laminate.make_smeared().

References

[1]

Shrivastava, S., Sharma, N., Tsai, S. W., and Mohite, P. M., D and DD-Drop Layup Optimization of Aircraft Wing Panels under Multi-Load Case Design Environment, Composite Structures, 248, 112518, 2020.

[2]

Melo, J. D. D., Bi, J., and Tsai, S. W., A Novel Invariant-Based Design Approach to Carbon Fiber Reinforced Laminates, Composite Structures, 159, 44-52, 2017.