Consider a wall-stress model that is an ODE in the wall-normal direction. This would result, e.g., by assuming equilibrium (i.e., parallel flow without acceleration or any pressure gradient) and an eddy-viscosity model but without solving this ODE analytically. Our example in this section is the compressible equilibrium wall-stress model (cf. Kawai and Larsson, 2012; Larsson et al, 2016) given by the momentum equation

\begin{equation}

\label{eqn:wm_momentum}

\tag{1}

\frac{d}{dy} \left[\left( \mu_{\rm wm} + \mu_{t,{\rm wm}} \right)\frac{dU_{\rm wm}}{dy}\right] = 0 \,,\end{equation} the energy equation

\begin{equation}

\label{eqn:wm_energy}

\tag{2}

\frac{d}{dy}\left[c_p\left( \frac{\mu_{\rm wm}}{Pr} + \frac{\mu_{t,{\rm wm}}}{Pr_{t,{\rm wm}}} \right)\frac{dT_{\rm wm}}{dy}\right]=-\frac{d}{dy} \left[\left( \mu_{\rm wm} + \mu_{t,{\rm wm}} \right)U_{\rm wm} \frac{dU_{\rm wm}}{dy}\right]\,,\end{equation} and the eddy-viscosity

\begin{equation}

\label{eqn:mut}

\tag{3}

\mu_{t,{\rm wm}} = \kappa \rho_{\rm wm} \sqrt{\frac{\tau_{w, {\rm wm}}}{\rho_{\rm wm}}} \, y\left[ 1 – \exp \left( -y^*/A^+ \right) \right]^2\,,\\y^* = \frac{y \sqrt{\rho \tau_w}}{\mu}\,,\end{equation} where the scaled wall-distance in the Van Driest damping function is in semi-local scaling in order to work in strongly non-adiabatic conditions (Patel et al, 2015; Trettel and Larsson, 2016).

The model parameters are taken as \(\kappa=0.41\), \(A^+=17\) and \(Pr_{t,{\rm wm}}=0.9\). The coordinate \(y\) is wall-distance, and thus the equations should be solved between \(y=0\) (the wall) and \(y=h_{\rm wm}\). The solution to the wall-stress model is labeled \(U_{\rm wm}\) and \(T_{\rm wm}\) to emphasize that it is different from the velocity and temperature in the LES code itself. Similarly, the quantities \(\mu_{\rm wm}\), \(\rho_{\rm wm}\) and \(\tau_{w, {\rm wm}}\) are computed from the solution to the wall-stress model, *not* from the LES solution.

The boundary conditions on the wall-stress model solution at the top are \begin{align*} U_{\rm wm} (h_{\rm wm}) &= \left| \vec{u}_{{\rm wm-top}, \parallel} \right| \,, \\ T(h_{\rm wm}) &= T_{\rm wm-top} \,, \end{align*} (i.e., Dirichlet conditions at the velocity and temperature interpolated from the LES). At the wall, the boundary conditions are exactly what they would be in a RANS solver, i.e., \(U_{\rm wm}(0) = 0\) and either a Dirichlet or Neumann condition on \(T_{\rm wm}(0)\). This completes the specification of the wall-stress model on paper; what remains is to solve this numerically.

### Finite-volume grid

The wall-stress model described in Eqns. (\ref{eqn:wm_momentum})-(\ref{eqn:mut}) describes the conservation of momentum and total energy, and thus it is quite naturally solved using a finite-volume method. This is true even if the LES code itself uses a different approach! The approach used in our own work has been to use a lightly stretched finite-volume grid defined by \begin{align*} y_{{\rm f},j} &= \Delta y_w \, \frac{ r^j – 1 }{r-1} \,, \ \ j=0,1,\ldots,n \\ y_{{\rm c},j} &= \frac{ y_{{\rm f},j} + y_{{\rm f},j+1}}{2} \,, \ \ j=0,1,\ldots,n-1 \end{align*} where \(y_{{\rm f}, j}\) and \(y_{{\rm c},j}\) are the coordinates of the \(j\)th face and cell-centroid, respectively, and \(\Delta y_w\) is the spacing at the wall. Note that the size of the \(j\)th cell is \(\Delta y_j = y_{{\rm f}, j+1} - y_{{\rm f}, j} = \Delta y_w \, r^j\) (so \(r\) is the stretching parameter).

The parameters \(\Delta y_w\) and \(r\) should be chosen to produce an acceptable error (in the wall-stress model solution itself) at minimum cost (i.e., the number of wall-stress model cells \(n\)). For the second-order numerics discussed below, we have found that the optimal values of \((\Delta y_w^+, r)\) are approximately \((0.6, 1.016)\) for 0.005% error, \((0.8, 1.025)\) for 0.01% error, \((1.2, 1.066)\) for 0.05% error, and \((1.2, 1.10)\) for 0.1% error, where the error is the estimated error in the friction coefficient (note: the actual error depends on the Reynolds number and the flow in question, so these are just guidelines).

In addition, the centroid of the final cell should be at height \(h_{\rm wm}\) above the wall in order to impose the boundary condition at the right height (i.e., \(y_{{\rm c}, n-1} = h_{\rm wm}\)). In practice, this can be achieved by adjusting the value of \(\Delta y_w\) once the grid has been built (i.e., to build the grid, and then change all coordinates by the same factor).

Note that the ODE-grid must be created in outer units (i.e., not viscous units) since we need to match up the last cell center to \(h_{\rm wm}\), which is necessarily given in outer units. We therefore need to keep track of the maximum value of \(\Delta y_w^+\) during the LES run, since this needs to be sufficiently small for our desired error level. This is not a major issue in general: the grid-stretching means that one can err on the side of too small \(\Delta y_w\) at a very small additional cost.

### Solving the finite-volume equations

A finite-volume discretization of the momentum equation (\ref{eqn:wm_momentum}) is

\begin{equation}\label{eqn:wm_momentum_discrete}\tag{4}\left. \left( \mu_{\rm wm} + \mu_{t,{\rm wm}} \right) \frac{dU_{\rm wm}}{dy} \right|_{{\rm f}, j+1}-\left. \left( \mu_{\rm wm} + \mu_{t,{\rm wm}} \right) \frac{dU_{\rm wm}}{dy} \right|_{{\rm f}, j}= 0 \,, \ \ j=0,1,\ldots,n-2\,,\end{equation} which should be solved for cells \(j=0,1,\ldots,n-2\) (i.e., not for the last cell \(n-1\) where we impose the boundary condition). The derivative of the velocity is then approximated using a second-order central finite-difference, i.e., as \[\left. \frac{dU_{\rm wm}}{dy} \right|_{{\rm f}, j} \approx \frac{U_{{\rm wm},j}-U_{{\rm wm},j-1}}{y_{{\rm c},j}-y_{{\rm c},j-1}}\,, \ \ j=1,2,\ldots,n-1\,.\]

A standard one-sided approximation is used at the boundary, i.e.,\[\left. \frac{dU_{\rm wm}}{dy} \right|_{{\rm f}, w} \approx\frac{U_{{\rm wm}, 0} – U_{{\rm wm}, w} }{y_{{\rm c},0} – 0}\,.\]

The discretization of the energy equation (\ref{eqn:wm_energy}) is analogous.

The initial guesses for \(U_{\rm wm}\) and \(T_{\rm wm}\) can be either linear profiles or, if they are stored, the solutions from the prior time step. From these initial guesses one computes \(\tau_{w, {\rm wm}}\) (by a standard finite-difference in the first off-wall cell), \(\rho_{\rm wm}\) at the face locations (from the equation-of-state, assuming constant \(p\) taken from the LES), \(\mu_{\rm wm}\) at the face locations (from the viscosity law), and \(\mu_{t, {\rm wm}}\) at the face locations (from Eqn. (\ref{eqn:mut})).

In our own implementations we then solve the discretized equations in a segregated fashion, i.e., we do: (i) solve the momentum equation (\ref{eqn:wm_momentum_discrete}) treating \(\mu_{\rm wm}\) and \(\mu_{t, {\rm wm}}\) as fixed; (ii) update \(\tau_{w, {\rm wm}}\) and \(\mu_{t, {\rm wm}}\); (iii) solve the energy equation while treating everything except \(T_{\rm wm}\) as fixed; (iv) update \(\tau_{w, {\rm wm}}\), \(\mu_{\rm wm}\), \(\rho_{\rm wm}\), and \(\mu_{t, {\rm wm}}\); and (v) repeat until convergence.

When treating the ODE-system in this segregated manner, each equation is a tri-diagonal system that can be solved efficiently by the tri-diagonal matrix algorithm (TDMA). Convergence is best measured by the values of \(\tau_{w, {\rm wm}}\) and \(q_{w, {\rm wm}}\) (or \(T_{w, {\rm wm}}\)), since these are the actual outputs of the wall-model. For example, one can iterate until these values change from iteration to iteration by less than some number (we use 0.01%).

After convergence, the wall-stress model would send \(\tau_{w, {\rm wm}}\) back to the LES solver where it is used in the coupling procedure as the magnitude of the wall-parallel stress \(\left| \vec{\tau}_{w, \parallel} \right|\). In addition, either or both of the heat flux \(q_{w, {\rm wm}}\) or the wall temperature \(T_{w, {\rm wm}}\) are sent back as well.