During several years I was studying, implementing and optimising the wave propagation. I am still fascinated by the simulation of the waves in the heterogeneous medium. On the one hand the wave equation in time domain is relatively easy to understand and its simplest form can be implemented very quickly even in 3D. This is because it is based on a simple time-stepping scheme. On the other hand, it is very tricky to optimise and it is one of the hardest equations to solve if formulated in the frequency domain. The latter is called the Helmholtz equation, time independent wave equation.
Why is the wave equation difficult to solve? First of all, because the size of the problem is most of the time very large. Either you want to simulate the wave propagation in the Earth, which may be several kilometers in horizontal and vertical directions. Or you want the simulation to be accurate, then you choose small discretization size and/or small time step.
Secondly, the wave equation on its own is given for the unbounded medium, but for practical applications, of course, you want to restrict the computational domain and use boundary conditions. The boundary conditions are not straightforward in both time and frequency domain. There you need to compromise either the problem size or the complexity of the formulation.
As well known, picture says more than thousand words, here is the video of the wave propagation in 2D.
On the background you see the Marmousi velocity model with different coloured layers representing different velocities. The velocity model is positioned in front of the viewer. The source is located just below the surface and comprises a Ricker wavelet. To simulate the wave propagation in unbounded medium, we added absorbing boundary conditions. What we see is the 3D view of the 2D wave propagation, showing the amplitude of the waves.