although because we use templates it is very easy to convert this program to 3D.
There are two regimes that depend on the waveguide width:
- Single mode: In this case the width of the structure is much
- smaller that the wavelength, therefore the waveguide is single mode.
- This case can be solved either with FEM (approach that we take here) or with
+ smaller than the wavelength, therefore the waveguide is single mode.
+ This case can be solved either with FEM (the approach that we take here) or with
a simple semi-analytical
[1D transfer matrix formalism](https://en.wikipedia.org/wiki/Transfer_matrix).
- Multimode: In this case the width of the structure is larger than the
This case can be solved using FEM
or with a [scattering matrix formalism](https://doi.org/10.1103/PhysRevA.94.033813).
Although we do not study this case in this tutorial, it is very easy to reach the multimode
- by increasing the parameter waveguide width (`dimension_y` in the jupyter notebook).
+ case by increasing the parameter waveguide width (`dimension_y` in the jupyter notebook).
The simulations of this tutorial are performed in the frequency domain.
To calculate the transmission spectrum, we use a
simulations. A pulse at a certain frequency is generated on the left side of the
structure and the transmitted energy is measured on the right side of the structure.
The simulation is run twice. First, we run the simulation with the phononic
-structure and measure the transmitted energy.
+structure and measure the transmitted energy:
<img alt="Phononic superlattice cavity" src="https://raw.githubusercontent.com/dangars/dealii/phononic-cavity/examples/step-62/doc/step-62.02.svg?sanitize=true" height="200" />
-Then we run the simulation without the phononic structure and measure the transmitted
-energy; we use the simulation without the structure for the calibration.
+Then, we run the simulation without the phononic structure and measure the transmitted
+energy; we use the simulation without the structure for the calibration:
<img alt="Phononic superlattice cavity" src="https://raw.githubusercontent.com/dangars/dealii/phononic-cavity/examples/step-62/doc/step-62.03.svg?sanitize=true" height="200" />
<h3>Elastic equations</h3>
-The elastic equations in the time domain are
+What we want to simulate here is the transmission of elastic
+waves. Consequently, the right description of the problem uses the
+elastic equations, which in the time domain are given by
@f[
\rho\partial_{tt} u_i - \partial_j (c_{ijkl} \varepsilon_{kl}) = f_i,
\qquad i=0,1,2
@f]
-where the stiffness tensor $c_{ijkl}$ depends on the spacial coordinates and
-the strain is given by
+where the stiffness tensor $c_{ijkl}$ depends on the spatial coordinates and
+the strain is the symmetrized gradient of the displacement, given by
@f[
\varepsilon_{kl} =\frac{1}{2}(\partial_k u_l + \partial_l u_k)
@f]
[A perfectly matched layer (PML)](https://en.wikipedia.org/wiki/Perfectly_matched_layer)
can be used to truncate the solution at the boundaries.
-A PML is a transformation that results in a complex coordinate stretching.
-The elastic equations in the frequency domain read as follows
+A PML is a transformation that results in a complex coordinate
+stretching.
+
+Instead of a time domain approach, this tutorial program converts the
+equations above into the frequency domain by performing a Fourier
+transform with regard to the time variable.
+The elastic equations in the frequency domain then read as follows
@f{eqnarray*}
\nabla\cdot(\boldsymbol{\bar\sigma} \xi \boldsymbol{\Lambda})&=&-\omega^2\rho\xi\mathbf{\bar u}\\
\boldsymbol{\bar \sigma} &=&\mathbf{C}\boldsymbol{\bar\varepsilon}\\
// @sect3{Auxiliary classes and functions}
// The following classes are used to store the parameters of the simulation.
- // @sect4{`RightHandSide` class}
+ // @sect4{The `RightHandSide` class}
// This class is used to define the force pulse on the left side of the
- // structure.
+ // structure:
template <int dim>
class RightHandSide : public Function<dim>
{
public:
RightHandSide(HDF5::Group &data);
virtual double value(const Point<dim> & p,
- const unsigned int component) const;
+ const unsigned int component) const override;
private:
// `data` is the HDF5::Group in which all the simulation results will be
const unsigned int force_component = 0;
};
- // @sect4{`PML` class}
- // This class is used to define the shape of the PML.
+ // @sect4{The `PML` class}
+ // This class is used to define the shape of the Perfectly Matches
+ // Layer (PML) to absorb waves traveling towards the boundary:
template <int dim>
class PML : public Function<dim, std::complex<double>>
{
- // @sect4{`Rho` class}
+ // @sect4{The `Rho` class}
// This class is used to define the mass density.
template <int dim>
class Rho : public Function<dim>
- // @sect4{`Parameters` class}
+ // @sect4{The `Parameters` class}
// This class contains all the parameters that will be used in the simulation.
template <int dim>
class Parameters
// The calculation of the mass and stiffness matrices is very expensive. These
// matrices are the same for all the frequency steps. The right hand side
// vector is also the same for all the frequency steps. We use this class to
- // store these values and re-use them at each frequency step. The
+ // store these objects and re-use them at each frequency step. The
// `PointHistory` class has already been used in step-18.
-
template <int dim>
class PointHistory
{
- // @sect4{`get_stiffness_tensor` function}
+ // @sect4{The `get_stiffness_tensor()` function}
// This class returns the stiffness tensor of the material. For the sake of
// simplicity we consider the stiffness to be isotropic and homogeneous; only
- // @sect3{`ElasticWave` class}
+ // @sect3{The `ElasticWave` class}
// Next let's declare the main class of this program. Its structure is very
// similar to the step-40 tutorial program. The main differences are:
- // - The sweep over the frequency vector.
+ // - The sweep over the frequency values.
// - We save the stiffness and mass matrices in `quadrature_point_history` and
- // use them for each frequency step.
+ // use them for each frequency step.
// - We store the measured energy by the probe for each frequency step in the
- // HDF5 file.
+ // HDF5 file.
template <int dim>
class ElasticWave
{
}
} // namespace step62
-using namespace dealii;
+
// @sect4{The main function}
{
try
{
- const int dim = 2;
+ using namespace dealii;
+ const unsigned int dim = 2;
Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, 1);