## 3 DMD Algorithm  
The dynamic mode decomposition (DMD) method is used in this article. We decompose the two instantaneous parameters--wall shear stress and pressure on the Ahmed body surface--into spatial and temporal modes. The spatial mode helps us observe the coherent structures on the car surface, while the temporal modes provide valuable information about the time evolution of these structures as the flow progresses. In addition, by transferring these modes to the frequency domain, we can study the time-dependent nature of the flow. This aids in understanding the correlation between different coherent structures and their contribution to the aerodynamic characteristics. For these decomposition purposes, the collected data are arranged into a vector of interest, described as follows:  
\[X_{i}=\left[x_{i}^{1},x_{i}^{2},x_{i}^{3},x_{i}^{4}\ldots,x_{i}^{n}\right] \tag{1}\]  
In Equation (1), the subscript \(i\) represents the \(i\)th element of the grid in the flow field. The superscript represents the snapshot sequence number, and \(n\) is the total number of time snapshots for the grid element \(X_{i}\). In this way, the quantity \(x_{i}^{j}\) in the row vector implies the value of a scalar \(x\) at the \(i\)th element corresponding to time-sequence \(j\). If we combine the row vectors of all grid elements, the resulting matrix will take the form as shown in Equation (2):\[\mathbf{X}= \begin{bmatrix}x_{1}^{1}&\dots&x_{1}^{n}\\.&\dots&.\\.&\dots&.\\.&\dots&.\\ x_{m}^{1}&\dots&x_{m}^{n}\end{bmatrix}  \tag{2}\]  
DMD decomposes a scalar \(x\) into a set of spatial modes that have a fixed oscillation frequency with a decay/growth rate; scalar \(x\) can be any fluid property, such as the \(i\)-component of the velocity, pressure, vorticity, turbulent kinetic energy (TKE), etc. The algorithm for finding the modal frequency and decay rate involves splitting the matrix \(X\) into two matrices. One matrix contains values from time-sequence \(1\) to \(n-1\), and the other matrix is formed by shifting the first matrix forward by one time-sequence. Thus, we obtain two matrices, \(X^{k}\) and \(X^{k+1}\), as shown in Equation (3):  
\[\mathbf{X}^{(k)}= \begin{bmatrix}x_{1}^{1}&\dots&x_{1}^{N-1}\\.&\dots&.\\.&\dots&.\\.&\dots&.\\ x_{m}^{1}&\dots&x_{m}^{N-1}\end{bmatrix} \quad\text{and}\quad\mathbf{X}^{(k+1) }= \begin{bmatrix}x_{1}^{2}&\dots&x_{1}^{N}\\.&\dots&.\\.&\dots&.\\ x_{m}^{2}&\dots&x_{m}^{N}\end{bmatrix}  \tag{3}\]  
[PERSON] [17] suggested that, for a small time difference, the flow evolution can be linearized as follows:  
\[\mathbf{X}^{(k+1)}\approx A\mathbf{X}^{(k)} \tag{4}\]  
where the matrix \(\mathbf{A}\) is a linear operator that describes the temporal evolution of the system's output in a linear way, even though the system itself is nonlinear, i.e., it is a Koopman operator. Since \(\mathbf{X}\) is generally not a square matrix, the standard matrix inversion cannot be applied, and the pseudoinverse must be used instead. Thus, \(A\) can be determined by multiplying \(\mathbf{X}^{(k+1)}\) by the pseudoinverse of \(\mathbf{X}^{(k)}\). For simplicity, matrix \(\mathbf{X}^{(k+1)}\) will be denoted as \(\mathbf{X}^{\prime}\) and should not be confused with the adjoint of the matrix, which is represented as \(\mathbf{X}^{*}\). The eigenvalue \(\lambda\) can be expressed in complex form as \(\lambda=a+ib\), where \(a\) is the real part, which relates to the growth or decay of the mode over time, and \(b\) is the imaginary part, which corresponds to the oscillation frequency of the mode. Equation (5) relates the eigenvalue \(\lambda\) of the system to its corresponding temporal growth (real component) rate and frequency (imaginary component). \[\omega=\frac{ln(\lambda)}{dt}=\frac{ln(a+ib)}{dt} \tag{5}\]  
By calculating the growth rate and frequency of modes, the DMD algorithm can provide a local, high-dimensional linear approximation of the solution to the underlying nonlinear dynamical system.