\documentclass[../main/NEMO_manual]{subfiles}
\begin{document}
% ================================================================
% Chapter stochastic parametrization of EOS (STO)
% ================================================================
\chapter{Stochastic Parametrization of EOS (STO)}
\label{chap:STO}
Authors: P.-A. Bouttier
\minitoc
\newpage
The stochastic parametrization module aims to explicitly simulate uncertainties in the model.
More particularly, \cite{brankart_OM13} has shown that,
because of the nonlinearity of the seawater equation of state, unresolved scales represent a major source of
uncertainties in the computation of the large scale horizontal density gradient (from T/S large scale fields),
and that the impact of these uncertainties can be simulated by
random processes representing unresolved T/S fluctuations.
The stochastic formulation of the equation of state can be written as:
\begin{equation}
\label{eq:eos_sto}
\rho = \frac{1}{2} \sum_{i=1}^m\{ \rho[T+\Delta T_i,S+\Delta S_i,p_o(z)] + \rho[T-\Delta T_i,S-\Delta S_i,p_o(z)] \}
\end{equation}
where $p_o(z)$ is the reference pressure depending on the depth and,
$\Delta T_i$ and $\Delta S_i$ are a set of T/S perturbations defined as
the scalar product of the respective local T/S gradients with random walks $\mathbf{\xi}$:
\begin{equation}
\label{eq:sto_pert}
\Delta T_i = \mathbf{\xi}_i \cdot \nabla T \qquad \hbox{and} \qquad \Delta S_i = \mathbf{\xi}_i \cdot \nabla S
\end{equation}
$\mathbf{\xi}_i$ are produced by a first-order autoregressive processes (AR-1) with
a parametrized decorrelation time scale, and horizontal and vertical standard deviations $\sigma_s$.
$\mathbf{\xi}$ are uncorrelated over the horizontal and fully correlated along the vertical.
\section{Stochastic processes}
\label{sec:STO_the_details}
The starting point of our implementation of stochastic parameterizations in NEMO is to observe that
many existing parameterizations are based on autoregressive processes,
which are used as a basic source of randomness to transform a deterministic model into a probabilistic model.
A generic approach is thus to add one single new module in NEMO,
generating processes with appropriate statistics to simulate each kind of uncertainty in the model
(see \cite{brankart.candille.ea_GMD15} for more details).
In practice, at every model grid point,
independent Gaussian autoregressive processes~$\xi^{(i)},\,i=1,\ldots,m$ are first generated using
the same basic equation:
\begin{equation}
\label{eq:autoreg}
\xi^{(i)}_{k+1} = a^{(i)} \xi^{(i)}_k + b^{(i)} w^{(i)} + c^{(i)}
\end{equation}
\noindent
where $k$ is the index of the model timestep and
$a^{(i)}$, $b^{(i)}$, $c^{(i)}$ are parameters defining the mean ($\mu^{(i)}$) standard deviation ($\sigma^{(i)}$) and
correlation timescale ($\tau^{(i)}$) of each process:
\begin{itemize}
\item
for order~1 processes, $w^{(i)}$ is a Gaussian white noise, with zero mean and standard deviation equal to~1,
and the parameters $a^{(i)}$, $b^{(i)}$, $c^{(i)}$ are given by:
\[
% \label{eq:ord1}
\left\{
\begin{array}{l}
a^{(i)} = \varphi \\
b^{(i)} = \sigma^{(i)} \sqrt{ 1 - \varphi^2 } \qquad\qquad\mbox{with}\qquad\qquad \varphi = \exp \left( - 1 / \tau^{(i)} \right) \\
c^{(i)} = \mu^{(i)} \left( 1 - \varphi \right) \\
\end{array}
\right.
\]
\item
for order~$n>1$ processes, $w^{(i)}$ is an order~$n-1$ autoregressive process, with zero mean,
standard deviation equal to~$\sigma^{(i)}$;
correlation timescale equal to~$\tau^{(i)}$;
and the parameters $a^{(i)}$, $b^{(i)}$, $c^{(i)}$ are given by:
\begin{equation}
\label{eq:ord2}
\left\{
\begin{array}{l}
a^{(i)} = \varphi \\
b^{(i)} = \frac{n-1}{2(4n-3)} \sqrt{ 1 - \varphi^2 }
\qquad\qquad\mbox{with}\qquad\qquad
\varphi = \exp \left( - 1 / \tau^{(i)} \right) \\
c^{(i)} = \mu^{(i)} \left( 1 - \varphi \right) \\
\end{array}
\right.
\end{equation}
\end{itemize}
\noindent
In this way, higher order processes can be easily generated recursively using the same piece of code implementing
(\autoref{eq:autoreg}), and using succesively processes from order $0$ to~$n-1$ as~$w^{(i)}$.
The parameters in (\autoref{eq:ord2}) are computed so that this recursive application of
(\autoref{eq:autoreg}) leads to processes with the required standard deviation and correlation timescale,
with the additional condition that the $n-1$ first derivatives of the autocorrelation function are equal to
zero at~$t=0$, so that the resulting processes become smoother and smoother as $n$ is increased.
Overall, this method provides quite a simple and generic way of generating a wide class of stochastic processes.
However, this also means that new model parameters are needed to specify each of these stochastic processes.
As in any parameterization of lacking physics, a very important issues then to tune these new parameters using
either first principles, model simulations, or real-world observations.
\section{Implementation details}
\label{sec:STO_thech_details}
%---------------------------------------namsbc--------------------------------------------------
\nlst{namsto}
%--------------------------------------------------------------------------------------------------------------
The computer code implementing stochastic parametrisations can be found in the STO directory.
It involves three modules :
\begin{description}
\item[\mdl{stopar}:]
define the Stochastic parameters and their time evolution.
\item[\mdl{storng}:]
a random number generator based on (and includes) the 64-bit KISS (Keep It Simple Stupid) random number generator
distributed by George Marsaglia
(see \href{https://groups.google.com/forum/#!searchin/comp.lang.fortran/64-bit$20KISS$20RNGs}{here})
\item[\mdl{stopts}:]
stochastic parametrisation associated with the non-linearity of the equation of seawater,
implementing \autoref{eq:sto_pert} and specific piece of code in
the equation of state implementing \autoref{eq:eos_sto}.
\end{description}
The \mdl{stopar} module has 3 public routines to be called by the model (in our case, NEMO):
The first routine (\rou{sto\_par}) is a direct implementation of (\autoref{eq:autoreg}),
applied at each model grid point (in 2D or 3D), and called at each model time step ($k$) to
update every autoregressive process ($i=1,\ldots,m$).
This routine also includes a filtering operator, applied to $w^{(i)}$,
to introduce a spatial correlation between the stochastic processes.
The second routine (\rou{sto\_par\_init}) is an initialization routine mainly dedicated to
the computation of parameters $a^{(i)}, b^{(i)}, c^{(i)}$ for each autoregressive process,
as a function of the statistical properties required by the model user
(mean, standard deviation, time correlation, order of the process,\ldots).
Parameters for the processes can be specified through the following \ngn{namsto} namelist parameters:
\begin{description}
\item[\np{nn\_sto\_eos}:] number of independent random walks
\item[\np{rn\_eos\_stdxy}:] random walk horz. standard deviation (in grid points)
\item[\np{rn\_eos\_stdz}:] random walk vert. standard deviation (in grid points)
\item[\np{rn\_eos\_tcor}:] random walk time correlation (in timesteps)
\item[\np{nn\_eos\_ord}:] order of autoregressive processes
\item[\np{nn\_eos\_flt}:] passes of Laplacian filter
\item[\np{rn\_eos\_lim}:] limitation factor (default = 3.0)
\end{description}
This routine also includes the initialization (seeding) of the random number generator.
The third routine (\rou{sto\_rst\_write}) writes a restart file
(which suffix name is given by \np{cn\_storst\_out} namelist parameter) containing the current value of
all autoregressive processes to allow restarting a simulation from where it has been interrupted.
This file also contains the current state of the random number generator.
When \np{ln\_rststo} is set to \forcode{.true.}),
the restart file (which suffix name is given by \np{cn\_storst\_in} namelist parameter) is read by
the initialization routine (\rou{sto\_par\_init}).
The simulation will continue exactly as if it was not interrupted only
when \np{ln\_rstseed} is set to \forcode{.true.},
\ie when the state of the random number generator is read in the restart file.
\biblio
\pindex
\end{document}