.. only:: html
.. note::
:class: sphx-glr-download-link-note
Click :ref:`here ` to download the full example code
.. rst-class:: sphx-glr-example-title
.. _sphx_glr_auto_examples_plot_stinsonSlit.py:
How to define custom wavenumber functions
===========================================
In this example we define a custom wavenumber. We inherit from the :class:`.WaveGuide` class and overwrite the internal
:meth:`.WaveGuide.get_wavenumber` function. By doing so, we have access to the internal class arguments, such as the domain properties.
.. image:: ../../image/wave1.JPG
:width: 800
1. Inheritance
---------------
First, we import the packages needed for the this example.
.. code-block:: default
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy
import acdecom
We create a new class, that we call "slit". We use the *slit* class to define a wavenumber for slit-like
waveguides within the plane wave range. We implement Stinson's wavenumber for slits. We inherit from
*acdecom.testdomain* and overwrite two of the methods, namely :meth:`WaveGuide.get_K0`, which computes the dissipation factor, and
:meth:`WaveGuide.get_eigenvalue`\, which computes the Eigenvalue :math:`\kappa_{m,n}` that is used to compute the wavenumbers and cut-ons for
higher-order modes.
.. warning::
As the overwritten methods are called by other internal functions, they must have the same positional parameters
as their original. Refer to the documentation for more information.
.. code-block:: default
class slit(acdecom.WaveGuide):
# We inherit all methods and internal variables from *WaveGuide*
def compute_f(self, x, omega, b):
return 1 - numpy.tanh(numpy.sqrt(1j * omega * b ** 2 / x)) / numpy.sqrt(1j * omega * b ** 2 / x)
def get_K0(self,m,n,f,**kwargs):
# here, we overwrite the function to compute the dissipation factor.
# We have to use the same positional parameters as in the original function
constants = self.get_domainvalues()
mu = constants["dynamic_viscosity"]
cp = constants["specific_heat"]
kth = constants["thermal_conductivity"]
rho = constants["density"]
gamma = constants["heat_capacity"]
b = self.dimensions[0]/2
omega = 2*numpy.pi*f
v = mu/rho
vp = kth/rho/cp
wavenumber = numpy.sqrt(numpy.array(-(gamma - (gamma - 1) * self.compute_f(vp / gamma, omega, b))
/ self.compute_f(v, omega, b), dtype=complex))* -1j
return wavenumber
def get_eigenvalue(self, m, n):
# here we overwrite the function to compute the eigenvalues for the wavenumbers and cut-ons.
return numpy.pi * (m / self.dimensions[0])
2. Initialization
-----------------
We create a WaveGuide in slit shape with a dimension of 0.01 m and without flow.
.. note::
We have to leave the *damping* argument empty; otherwise our new *get_K0* function will be overwritten by
a predefined function.
.. code-block:: default
slit_width = 0.01 # m
Mach_number = 0
slit_duct = slit(dimensions=(slit_width,), M=Mach_number)
3. Extract the Wavenumbers
-------------------
We can now loop through the frequencies of interest and compute the wavenumbers for the slit
.. code-block:: default
wavenumber_slit=[]
frequencies = range(100,2000,50)
m, n = 0, 0
for f in frequencies:
wavenumber_slit.append(slit_duct.get_wavenumber(m, n, f))
4. Plot
----
We want to compare the wavenumbers of the slit to the wavenumbers of a rectangular duct with different ratios of
slit length and slit width and plot the results
.. code-block:: default
ratio_values = [1, 3, 5, 10, 20]
plt.figure()
colors = cm.plasma_r(numpy.linspace(0,1,len(ratio_values)+1))
for rIndx, ratio in enumerate(ratio_values):
rect_duct = acdecom.WaveGuide(cross_section="rectangular", dimensions=(slit_width, slit_width*ratio),
damping="stinson")
wavenumber_rect= []
for f in frequencies:
wavenumber_rect.append(rect_duct.get_wavenumber(m, n, f))
plt.plot(frequencies, numpy.imag(wavenumber_rect), color=colors[rIndx], ls="--", label="Rect. b/a = "+str(ratio))
plt.plot(frequencies, numpy.imag(wavenumber_slit), color=colors[-1], label="Slit-shape")
plt.xlabel("Frequency [Hz]")
plt.ylabel("$Im(k_{00})$")
plt.title("Comparing the dispersion of slit-shaped and \n rectangular ducts without flow")
plt.legend()
plt.show()
.. image:: /auto_examples/images/sphx_glr_plot_stinsonSlit_001.png
:alt: Comparing the dispersion of slit-shaped and rectangular ducts without flow
:class: sphx-glr-single-img
.. rst-class:: sphx-glr-timing
**Total running time of the script:** ( 0 minutes 4.620 seconds)
.. _sphx_glr_download_auto_examples_plot_stinsonSlit.py:
.. only :: html
.. container:: sphx-glr-footer
:class: sphx-glr-footer-example
.. container:: sphx-glr-download sphx-glr-download-python
:download:`Download Python source code: plot_stinsonSlit.py `
.. container:: sphx-glr-download sphx-glr-download-jupyter
:download:`Download Jupyter notebook: plot_stinsonSlit.ipynb `
.. only:: html
.. rst-class:: sphx-glr-signature
`Gallery generated by Sphinx-Gallery `_