Infinite Layers
The infinite layer module models one dimensional systems as presented for example in the acoustic1Dsystems module. But here the dimensions perpendicular to the propagation direction are assumed to be infinitely extended instead of cross-sections with dimensions smaller than the wavelength. Consequently, there is an additional parameter required to deal with the infinite dimension: the in-plane wavenumber. For we have the same case as for one dimensional systems.
Lay-ups of practical interest may contain layers of various nature. According to Allard [All2009] this could be:
Foams or poro elastic materials
Fibre materials
Thick solid layers
Plate layers called impervious layers
Perforates
Due to the different nature of the layers, different degrees of freedom are required to describe the wave propagation. In a first version of pyva all layers could be modelled using pressure and out-of-plane velocity as degrees of freedom. With the introduction of new layers and physics this has changed.
Infinite layers are used as system in the pyva.models.TMmodel
class. This class provides the framework for combining these layers and
calculating global properties as absorption of transmission coefficients.
See section TMM - infinite Layer for applications of infinite layer in transfer matrix models.
Acoustic Layer
All infinite layer classes are subclasses of the pyva.systems.infiniteLayers.AcousticLayer
.
This class is an abstract class that implements all those methods that required by all infinite layers.
The subclass assumes the simplest case of degrees of freedom pressure and velocity.
In [All2009] the acoustic layers are called fluid layer because they can be described using the degrees of freedom of a fluid.
(1)
The related DOF object is created by the fluid_exc_dof()
function.
Beside the constructor that is exclusively used by the subclasses there is the get_xdata()
method that implements a specific logics for the wavenumber and angular frequency argument.
Mass Layer
The simplest AcousticLayer is the MassLayer
. As all subclasses it has implemented the transfer_impedance
method that
provides the 2x2 DynamicMatrix of the following form.
(2)
mass per area
The muss layer does not depend on the wavenumber. As the so called mass law of transmission is quite important in acoustics it is implemented for this class.
import pyva.systems.infiniteLayers as iL
heavy_2kg7 = iL.MassLayer(0.001, 2700)
tau_mass0 = heavy_2kg7.transmission_coefficient(omega,0.)
tau_mass30 = heavy_2kg7.transmission_coefficient(omega,30.*np.pi/180)
Plate Layer
When the plate is modelled as AcousticLayer there is connection of motion in in-plane direction considered. In other words every layer is free in x-direction.
The above matrix implements a different transfer impedance
(3)
With as transfer impedance of flat plates.
A plate is defined as follows.
import pyva.properties.structuralPropertyClasses as stPC
alu = matC.IsoMat()
alu1mm = stPC.PlateProp(0.001,alu)
iL_alu1mm = iL.PlateLayer(alu1mm,)
The PlateLayer class comes also with the transmission coefficient method
tau_plate0 = iL_alu1mm.transmission_coefficient(omega,0.)
tau_plate30 = iL_alu1mm.transmission_coefficient(omega,30.*np.pi/180)
Plotting all curves gives the typical infinite behaviour with the sharp coincidence.
Fluid Layer
An air gap or a layer of material that can be modelled as EquivalentFluid
is implemented
as FluidLayer
.
The transfer matrix of such a layer with complex wavenumber and thickness
reads.
(4)
This result follows from two fluid waves propagating in positive and negative direction with and given . Details of the derivation are given in section 9.3.3 of [Pei2022].
Fluid Layer Honeycomb
The honeycomb channels restrict the direction of propagation to pure z-propagation. Thus, in case of a honeycomb layer equation (4) is used with .
Solid Layer
The physics of the solid layer of isotropic solids is similar to the PlateLayer
but instead of using in-plane and out-of_plane waves
(bending) for the description, the layer is modelled by longitudinal- and shear-waves. Hence, there are two waves propagating in two directions.
Consequently the degrees of freedom that are required to describe the wave propagation are velocity in x- and z-direction as far as two coefficients of the stress tensor.
(5)
Please note, that the 13 index means index 5 in Voigt notation. Thus, this is 5 for local DOF orientation in the DOF
class,
meaning the rotation around the y-axis.
So, we leave the practical world of similar degrees of freedom for each layer.
As for all layers it is assumed that there is no propagation in y-direction.
The related DOF object is created by the solid_exc_dof()
function.
The detailed matrices are too detailed to be presented here, but the theory is presented in [All2009] in detail. However, the formulas have some typos and cannot be implemented as is. However, a correct formula for the solid layer is given in Appendix A of [Ara2021].
Bending waves are automatically included by this approach. So, the solid layer can be considered as a thick layer implementation of the plate.
In addition the effect of the solid layer in the full lay-up is different. By defining the velocity and shear stress in x-direction. A solid layer restricts the x-degrees of freedom of the connected layer.
Impervious Screen
The impervious screen is a different implementation of the sec:plate_layer. In contrast to the plate the impervious screen has the degrees of freedom of the solid layer. So there is an in-plane motion, but the velocity in x- and z-direction is equal on both sides.
The transfer matrix reads:
(6)
Here, is the same as in equation (3). is the in-plane impedance and read as.
(7)
With beeing the transversal stiffness implemented in
S_complex()
.
Poroelastic Layer
The physics of the poroelastic layer is a combination of fluid motion (in the porous material) and the structure motion of the frame. Thus, the combination of required degrees of freedom becomes quite complex.
(8)
Because of the fact that we have the similar degree of freedom for the fluid and the structure in two cases, namely the velocity and stress in z-direction a work around is required. Thus, the local DOF of 2 is taken for the fluid DOF - please keep this in mind as it is not the real orientation.
The related DOF object is created by the porous_exc_dof()
function.
The detailed matrices are definitely too detailed to be presented here, but the theory is presented in [All2009] in detail. To my surprise, these formulas have no typos and can be implemented as is.
In pyva the transfer matrix is calculated using the coordinate change of the Gamma function, thus:
(9)
The Gamma matrix can be found in [All2009] and the inversion is done analytically with the following result:
(10)
The convention follows the acronyms of Allard [All2009] , so see the detailed description there.
Use perforation at all plate-like infinite layers
In many applications plates or impervious screen layers are perforated. That means there is a fraction of motion given by the flow through the
perforation of the plate. This is done by using the perforation
keyword in the definition of the related infiniteLayers class.
We crate a perforate.
il_perforate = iL.PerforatedLayer(0.005, 0.001, distance = 0.02)
Note that this doen’t need to be a PerforatedLayer
this can also be a
simple ResistiveLayer
that just defines the transfer impedance of the layer.
The perforation is applied by the perforation
keyword argument.
il_steel_5mm_perf = iL.PlateLayer(steel5mm,perforation = il_perforate)
il_steel_5mm_s_perf = iL.ImperviousScreenLayer(steel5mm,perforation = il_perforate)
The perforation does not change the parameters of the plate. Thus, the loss in stiffness and mass due to perforation must be considered by the user.
Coupling transfer matrices
When layers of different nature are interfacing specific matrices are required to define the conditions of these interfaces. In section 11.4.2 of [All2009] those interfaces are described in detail. Due to our nomenclature an interface occurs at the right node of layer with and the left node of layer with . This can be for example the nodes 2 and 3.
Two layers of the same nature
When two adjacent layers are connected and there is no poroelastic material involved, there layer matrices and degrees of freedom are organized in such a way that simple matrix multiplication gives the combined matrix. :
(11)
In this case the final transfer matrix will have node 1 as output and node 4 as input. This makes this theory so practical when the nature of all layers is the same. When poroelastic materials are involved the porosity of each layer must be considered and an interface matrix becomes necessary. :
(12)
This matrix reads as:
(13)
This matrix is defined by the I_porous_porous()
function.
This function generates a DynamicMatrix
with the given node IDs as argument.
Two layers of the different nature
When such layers are interfacing the way how the different degrees of freedom are connected must be given. This is done be defining the conditions of for layer 1 and 2 and adjacent nodes 2 and 3 for example by:
(14)
The interface matrices are also given as a DynamicMatrix
object.
In this nomenclature the exc_dof of both matrices are clear, these are
and .
Allard does not care about the res_dof because he simply lines up the the equations. As pyva uses the
DynamicMatrix we have to define the res_dof that the entries will be considered in the final Allard matrix.
Solid-Fluid Interface
In order to explain the logics of the res_dof the solid-fluid interface is derived as example. We use the same layer and node IDs.
(15)
When writing this in matrix form it becomes clear that specific degrees of freedom determine the res_dof.
(16)
Thus, a logical res_dof is and is not part of it, because there is no condition defined.
When both layers are exchanged the matrices and are exchanged. But this means that the res_DOF is still linked to the ‘complicated’ layer of the connection, the solid. The res_dof is then similar, but connected to another node:
All this is taken into account in the methods hat generate the degrees of freedom of the Allard matrix, namely
pyva.models.TMmodel.V0()
and pyva.models.TMmodel.allard_matrix()
.