Composites Core Utils Module (composites.utils)#

Functions that create a Laminate from the stacking sequence and the ply data (laminated_plate()), for an isotropic plate (isotropic_plate()) or for double-double and N-double laminates (double_double_laminate(), n_double_laminate(), also available as double_double_plate and n_double_plate), and a MatLamina from a tuple of material properties (read_laminaprop()).

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

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 the material given by laminaprop and from the two angles. No plies are created, stack is [phideg, psideg], all the other stiffnesses are zero and Laminate.calc_equivalent_properties() is called.

Parameters:
thicknessfloat

Total plate thickness, length.

phidegfloat

Angle \(\phi\) of the DD laminate, in degrees.

psidegfloat

Angle \(\psi\) of the DD laminate, in degrees.

laminaproptuple

See read_laminaprop() for details. The default None is not accepted by read_laminaprop(), such that a value must be given.

rhofloat, optional

Material density, mass per unit volume. Default 0..

Returns:
lamLaminate

The double-double laminate.

Notes

With the principle of homogenization, at the limit where many plies are used we have that \(B=0\), see Shrivastava et al. [1]. The four plies \(\pm\phi\), \(\pm\psi\) have the same thickness, such that the stiffnesses are the averages of the ply stiffnesses of MatLamina.get_invariant_matrix() over the four angles, written with the trace \(tr\) and the trace-normalized invariants \(u_i^*\) of MatLamina.trace_normalize_plane_stress() [2]. With \(\alpha = (\phi + \psi)/2\) and \(\beta = (\phi - \psi)/2\), the averages of \(\cos 2\theta\) and \(\cos 4\theta\) are \(\cos 2\alpha \cos 2\beta\) and \(\cos 4\alpha \cos 4\beta\), and those of \(\sin 2\theta\) and \(\sin 4\theta\) vanish:

\[\begin{split}A_{11}^* = u_1^* + u_2^* \cos 2\alpha \cos 2\beta + u_3^* \cos 4\alpha \cos 4\beta, \quad A_{22}^* = u_1^* - u_2^* \cos 2\alpha \cos 2\beta + u_3^* \cos 4\alpha \cos 4\beta \\ A_{12}^* = u_4^* - u_3^* \cos 4\alpha \cos 4\beta, \quad A_{66}^* = u_5^* - u_3^* \cos 4\alpha \cos 4\beta, \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.

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

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 the material given by laminaprop and from the two angles. No plies are created, stack is [phideg, psideg], all the other stiffnesses are zero and Laminate.calc_equivalent_properties() is called.

Parameters:
thicknessfloat

Total plate thickness, length.

phidegfloat

Angle \(\phi\) of the DD laminate, in degrees.

psidegfloat

Angle \(\psi\) of the DD laminate, in degrees.

laminaproptuple

See read_laminaprop() for details. The default None is not accepted by read_laminaprop(), such that a value must be given.

rhofloat, optional

Material density, mass per unit volume. Default 0..

Returns:
lamLaminate

The double-double laminate.

Notes

With the principle of homogenization, at the limit where many plies are used we have that \(B=0\), see Shrivastava et al. [1]. The four plies \(\pm\phi\), \(\pm\psi\) have the same thickness, such that the stiffnesses are the averages of the ply stiffnesses of MatLamina.get_invariant_matrix() over the four angles, written with the trace \(tr\) and the trace-normalized invariants \(u_i^*\) of MatLamina.trace_normalize_plane_stress() [2]. With \(\alpha = (\phi + \psi)/2\) and \(\beta = (\phi - \psi)/2\), the averages of \(\cos 2\theta\) and \(\cos 4\theta\) are \(\cos 2\alpha \cos 2\beta\) and \(\cos 4\alpha \cos 4\beta\), and those of \(\sin 2\theta\) and \(\sin 4\theta\) vanish:

\[\begin{split}A_{11}^* = u_1^* + u_2^* \cos 2\alpha \cos 2\beta + u_3^* \cos 4\alpha \cos 4\beta, \quad A_{22}^* = u_1^* - u_2^* \cos 2\alpha \cos 2\beta + u_3^* \cos 4\alpha \cos 4\beta \\ A_{12}^* = u_4^* - u_3^* \cos 4\alpha \cos 4\beta, \quad A_{66}^* = u_5^* - u_3^* \cos 4\alpha \cos 4\beta, \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.

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.

Calls laminated_plate() with a single ply of angle 0, thickness thickness and laminaprop=(E, nu).

Parameters:
thicknessfloat

Plate thickness, length.

Efloat

Young modulus, force per unit area.

nufloat

Poisson’s ratio, dimensionless.

rhofloat, optional

Material density, mass per unit volume. Default 0..

offsetfloat, optional

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

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, and a DeprecationWarning is issued. Default None.

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. Default 'rohwer'.

Returns:
lamLaminate

The plate, with its stiffnesses and equivalent properties computed.

See also

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

One Lamina is created for each entry of stack, with its thickness, its MatLamina given by read_laminaprop() with its laminaprop and density, and Lamina.rebuild() called. Then Laminate.calc_constitutive_matrix() and Laminate.calc_equivalent_properties() are called.

Parameters:
stacklist

Angles of the stacking sequence in degrees, from the bottom to the top ply.

plytfloat, optional

When all plies have the same thickness, plyt can be supplied. plyt or plyts must be supplied. Length. Default None.

laminaproptuple, optional

When all plies have the same material properties, laminaprop can 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)

See read_laminaprop(). Default None.

rhofloat, optional

Uniform material density to be used for all plies, mass per unit volume. Default 0..

plytslist, optional

A list of floats with the thickness of each ply. When given, plyt is ignored. Length. Default None.

laminapropslist, optional

A list of tuples with a laminaprop for each ply. When given, laminaprop is ignored. Default None.

rhoslist, optional

A list of floats with the material density of each ply. When given, rho is ignored. Mass per unit volume. Default None.

offsetfloat, optional

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

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, and a DeprecationWarning is issued. Default None.

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

Returns:
lamLaminate

The laminate, with its stiffnesses and equivalent properties computed.

Raises:
ValueError

If neither plyt nor plyts is supplied, or if neither laminaprop nor laminaprops is supplied.

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

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 the material given by laminaprop and from the angles. No plies are created, stack is angles_deg, all the other stiffnesses are zero and Laminate.calc_equivalent_properties() is called.

Parameters:
thicknessfloat

Total plate thickness, length.

angles_deglist of float

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

laminaproptuple

See read_laminaprop() for details. The default None is not accepted by read_laminaprop(), such that a value must be given.

rhofloat, optional

Material density, mass per unit volume. Default 0..

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 stiffnesses are the same as those of composites.core.n_double_laminate(), with \(n\) the number of angles of angles_deg.

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.

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

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 the material given by laminaprop and from the angles. No plies are created, stack is angles_deg, all the other stiffnesses are zero and Laminate.calc_equivalent_properties() is called.

Parameters:
thicknessfloat

Total plate thickness, length.

angles_deglist of float

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

laminaproptuple

See read_laminaprop() for details. The default None is not accepted by read_laminaprop(), such that a value must be given.

rhofloat, optional

Material density, mass per unit volume. Default 0..

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 stiffnesses are the same as those of composites.core.n_double_laminate(), with \(n\) the number of angles of angles_deg.

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.

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

Returns a MatLamina object based on an input laminaprop tuple

The entries of laminaprop and rho are stored in a new MatLamina object, the Poisson’s ratios nu21, nu31 and nu32 are computed from nu12, nu13, nu23 and the Young moduli, and MatLamina.rebuild() is called. With 2 entries, g12 = g13 = g23 = e/(2*(1+nu)); with 2 or 6 entries, e3, nu13 and nu23 are zero. Another number of entries fails an assert statement.

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

23 Shear Modulus

e3

Young Module in direction 3

nu13

13 Poisson’s ratio

nu23

23 Poisson’s ratio

The Young and shear moduli have the dimension of force per unit area, the Poisson’s ratios are dimensionless.

rhofloat, optional

Material density, mass per unit volume. Default 0.

Returns:
matlamMatLamina

A MatLamina object.

Notes

The Poisson’s ratios not given follow from the reciprocity relations of an orthotropic material, \(\nu_{ij}/E_i = \nu_{ji}/E_j\), which make its compliance matrix symmetric [1]:

\[\nu_{21} = \nu_{12} \frac{E_2}{E_1}, \quad \nu_{31} = \nu_{13} \frac{E_3}{E_1}, \quad \nu_{32} = \nu_{23} \frac{E_3}{E_2}\]

and for an isotropic material \(G = E/(2(1 + \nu))\). With 2 or 6 entries, e3 = 0 makes the constitutive constants of MatLamina.rebuild() the plane-stress reduced stiffnesses.

References

[1]

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