Source code for seapy.components.plate
"""
Plate
-----
.. autoclass:: seapy.components.plate.Component2DPlate
Subsystems
++++++++++
.. autoclass:: seapy.components.plate.SubsystemLong
.. autoclass:: seapy.components.plate.SubsystemBend
.. autoclass:: seapy.components.plate.SubsystemShear
Classes describing a two-dimensional plate.
"""
import numpy as np
from .structural import ComponentStructural
from ..subsystems import SubsystemStructural
[docs]class SubsystemLong(SubsystemStructural):
"""
Subsystem for longitudinal waves in a 2D isotropic component.
"""
@property
[docs] def soundspeed_group(self):
"""Group velocity for longitudinal waves in a 2D isotopic plate.
:rtype: :class:`numpy.ndarray`
.. math:: c_L^{'} = \\sqrt{\\frac{E}{\\rho \\left( 1 - \\mu^2 \\right)}}
with:
* Young's modulus :math:`E`
* density :math:`\\rho`
* Poisson's ratio :math:`\\mu`
See Lyon, above eq 8.2.5
See Craik, table 3.2, third row, page 49.
Often the density is replaced as a surface density (mass per unit area) and the thickness or height of the plate.
"""
return np.ones(self.frequency.amount) * np.sqrt(self.component.material.young / (self.component.material.density * (1.0 - self.component.material.poisson**2.0)))
@property
[docs] def soundspeed_phase(self):
"""Phase velocity for longitudinal waves in a 2D isotropic plate.
:rtype: :class:`numpy.ndarray`
.. math:: c_{group} = c_{phase} = c_L
See Lyon, above eq 8.2.8
"""
return self.soundspeed_group
@property
[docs] def average_frequency_spacing(self):
"""Average frequency spacing for a 2D isotropic plate.
:rtype: :class:`numpy.ndarray`
.. math:: \\overline{\delta f}_S^{2D} = \\frac{{c_L^1}^2}{\\omega A}
with:
* soundspeed of longitudinal waves :math:`c_L`
* angular frequency :math:`\\omega`
* plate area :math:`A`
See Lyon, equation 8.2.8
"""
#try:
return self.soundspeed_group**2.0 / (self.frequency.angular * self.component.area)
#except FloatingPointError:
#return np.zeros(self.frequency.amount)
@property
[docs] def wavenumber(self, m, n, delta1, delta2):
"""Wavenumber for longitudinal waves in a plate.
:rtype: :class:`numpy.ndarray`
.. math:: k_L = \\sqrt{\\left[ \\left( m - \\delta_1 \\right) \\frac{\\pi}{L_1} \\right] + \\left[ \\left( n - \\delta_2 \\right) \\frac{\\pi}{L_2} \\right]}
See Lyon, equation 8.2.1.
"""
return np.sqrt( ( ( m - delta1) * np.pi / self.component.length) + ( ( m - delta2) * np.pi / self.component.width) )
@property
[docs] def impedance(self):
"""Impedance
:rtype: :class:`numpy.ndarray`
"""
raise NotImplementedError
#@property
#def wavenumber(self):
#"""
#Wavenumber of longitudinal waves in a plate.
#.. math:: k_L = \\frac{ \\rho \\omega \\left( 1 - \\nu \\right) }{E h}
#Langley and Heron, 1990, eq 24.
#"""
#return self.component.material.density * self.omega * (1.0 - self.component.material.poisson) / (self.component.material.young * self.component.height)
[docs]class SubsystemBend(SubsystemStructural):
"""
Subsystem for bending waves in a 2D isotropic component.
"""
@property
[docs] def soundspeed_phase(self):
"""Phase velocity for bending wave.
:rtype: :class:`numpy.ndarray`
.. math:: \\sqrt{\\omega} \\left( \\frac{B}{\\rho_s} \\right)^(1/4)
with:
* Angular frequency :math:`\\omega`
* Bending stiffness :math:`B`
* surface density :math:`\\rho_s`
See Craik, equation 5.19, page 128.
Note that this is the same as
.. math:: c_{B,\\phi}^{2D} = \\sqrt{\\omega \\kappa c_L^{'}}
See Lyon, above eq. 8.2.5
"""
return (self.frequency.angular**2.0 * self.flexural_rigidity / self.component.mass_per_area) **(0.25)
#return np.sqrt(self.frequency.angular * self.component.radius_of_gyration * self.component.subsystem_long.soundspeed_phase)
@property
[docs] def soundspeed_group(self):
"""Group velocity for bending wave.
:rtype: :class:`numpy.ndarray`
.. math:: c_{B, g}^{2D} = 2 c_{B,\\phi}^{2D}
See Lyon, above eq. 8.2.5
"""
return 2.0 * self.soundspeed_phase
@property
[docs] def average_frequency_spacing(self):
"""Average frequency spacing for bending waves in a 2D isotropic plate.
:rtype: :class:`numpy.ndarray`
.. math:: \\overline{\\delta f}_B^{2D} = \\frac{2 \\kappa c_L^{', 2D}}{A}
with:
* radius of gyration :math:`\\kappa`
* soundspeed of longitudinal waves :math:`c_L`
* plate area :math:`A`
See Lyon, eq 8.2.5
"""
return 2.0 * self.component.radius_of_gyration * self.component.subsystem_long.soundspeed_group / self.component.area
@property
[docs] def wavenumber(self):
"""Wavenumber of flexural waves in a plate.
:rtype: :class:`numpy.ndarray`
.. math:: k_B = \\sqrt[4]{ \\frac{ \\rho \\omega }{B}}
with:
* density of the plate :math:`\\rho`
* angular frequency :math:`\\omega`
* flexural rigidity :math:`\\B`
See Langley and Heron, 1990, eq 18.
"""
return np.power(self.component.material.density * self.frequency.angular / self.flexural_rigidity, 0.25)
@property
[docs] def flexural_rigidity(self):
"""Flexural rigidity of a plate.
:rtype: :class:`numpy.ndarray`
.. math:: B = \\frac{E h^3}{12 \\left( 1 - \\nu^2 \\right)}
with:
* Young's modulus :math:`E`
* plate thickness/height :math:`h`
* Poisson's ratio :math:`\\nu`
See Craik, equation 3.2, page 48.
"""
return self.component.material.young * self.component.height**3.0 / (12.0 * (1.0 - self.component.material.poisson**2.0))
#@property
#def impedance(self):
#"""Impedance.
#:rtype: :class:`numpy.ndarray`
#"""
#raise NotImplementedError
@property
[docs] def impedance_point_force(self):
"""Point impedance.
.. math:: Z_{B}^{F, 2D} = 8 \\rho h \\kappa_B c_L
with:
* density of the plate :math:`\\rho`
* radius of gyration :math:`kappa_B`
* soundspeed of longitudinal waves :math:`c_L`
See Lyon, page 201, table 10.1
"""
return 8.0 * self.component.material.density * self.component.height * self.component.radius_of_gyration * self.component.subsystem_long.soundspeed_group
[docs]class SubsystemShear(SubsystemStructural):
"""
Subsystem for shear waves in a 2D isotopic component.
"""
@property
[docs] def soundspeed_phase(self):
"""
Phase velocity for shear waves in a 2D isotropic plate.
.. math:: c_S = \\sqrt{\\frac{G}{\\rho}}
with:
* shear modulus :math:`G`
* density of the plate :math:`\\rho`
See Lyon, above eq. 8.2.5
"""
return np.ones(self.frequency.amount) * np.sqrt(self.component.material.shear / self.component.material.density)
@property
[docs] def soundspeed_group(self):
"""
Group velocity for shear wavees in a 2D isotropic plate.
.. math:: c_{group} = c_{phase} = 2 C_S
See Lyon, above eq. 8.2.5
"""
return self.soundspeed_phase
@property
[docs] def average_frequency_spacing(self):
"""
Average frequency spacing for shear waves in a 2D isotropic plate.
.. math:: \\overline{\\delta f}_S^{2D} = \\frac{c_S^2}{\\omega A}
with:
* soundspeed of shear waves :math:`c_S`
* angular frequency :math:`\\omega`
* area of the plate :math:`A`
See Lyon, eq 8.2.5
"""
#try:
return self.soundspeed_group**2.0 / (self.frequency.angular * self.component.area)
#except FloatingPointError:
#return np.zeros(self.frequency.amount)
@property
[docs] def wavenumber(self):
"""
Wavenumber of shear waves.
.. math:: k_S = \\frac{2 \\rho \\omega \\left( 1 + \\nu \\right) }{E h}
with:
* density :math:`\\rho`
* angular frequency :math:`\\omega`
* Poisson's ratio :math:`\\nu`
* Young's modulus :math:`E`
* plate thickness :math:`h`
Langley and Heron, 1990, eq 25
"""
return self.component.material.density * self.frequency.angular * (1.0 + self.component.material.poisson) / (self.component.material.young * self.component.height)
@property
def impedance(self):
raise NotImplementedError
[docs]class Component2DPlate(ComponentStructural):
"""
Two-dimensional plate component.
The following subsystems are implemented for this component:
* :class:`seapy.components.plate.SubsystemLong`
* :class:`seapy.components.plate.SubsystemBend`
* :class:`seapy.components.plate.SubsystemShear`
"""
SUBSYSTEMS = {'Long': SubsystemLong,
'Bend': SubsystemBend,
'Shear': SubsystemShear}
@property
[docs] def area(self):
"""Area of the plate.
.. math:: A = l w
with:
* length :math:`l`
* width :math:`w`
"""
return self.length * self.width
@property
[docs] def mass_per_area(self):
"""
Mass per unit area. Also called the surface density.
.. math:: m^{''} = \\rho h
with:
* density :math:`\\rho`
* plate thickness/height :math:`h`
"""
return self.material.density * self.height
@property
[docs] def radius_of_gyration(self):
"""
Radius of gyration :math:`\\kappa` is given by dividing the height of the plate by :math:`\\sqrt{12}`.
.. math:: \\kappa = \\frac{h}{\\sqrt{12}}
with:
* plate thickness/height :math:`h`
See Lyon, above eq. 8.2.5
"""
return self.height / np.sqrt(12.0)
@property
[docs] def area_moment_of_inertia(self):
"""
Area moment of inertia.
.. math:: J = \\frac{h^3}{12}
with:
* plate thickness/height :math:`h`
Following equation includes resistance to deflection and is thus part of the bending wave subsystem:
.. math:: J = \\frac{h^3}{12 \\left( 1 - \\nu^2 \\right)}
"""
return self.height**3.0 / 12.0
#return self.height**3.0 / (12.0 * (1.0 - self.poisson()**2.0))