%-------------------------------------------------------------------------------

% This file is part of Code_Saturne, a general-purpose CFD tool.
%
% Copyright (C) 1998-2016 EDF S.A.
%
% This program is free software; you can redistribute it and/or modify it under
% the terms of the GNU General Public License as published by the Free Software
% Foundation; either version 2 of the License, or (at your option) any later
% version.
%
% This program is distributed in the hope that it will be useful, but WITHOUT
% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
% FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
% details.
%
% You should have received a copy of the GNU General Public License along with
% this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
% Street, Fifth Floor, Boston, MA 02110-1301, USA.

%-------------------------------------------------------------------------------

\programme{vortex}
%
\vspace{1cm}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section*{Fonction}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Ce sous-programme est dédié à la génération des conditions d'entrée
turbulente utilisées en LES.


La méthode des vortex est basée sur une approche de tourbillons
ponctuels. L'idée de la méthode consiste à injecter des tourbillons 2D dans le
plan d'entrée du calcul, puis à calculer le champ de vitesse induit par ces
tourbillons au centre des faces d'entrée.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section*{Discr\'etisation}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Pour utiliser la méthode, on se place tout d'abord dans un repère local défini
de manière à ce que le plan $(0yz)$, où sont injectés les vortex, soit confondu
avec le plan d'entrée du calcul (voir figure \ref{Base_Vortex_entree}).

\begin{figure}[h]
\centerline{\includegraphics[height=6cm]{entree}}
\caption{\label{Base_Vortex_entree} Définiton des différentes grandeurs dans le repère local
correspondant à l'entrée d'une conduite de section carrée.}
\end{figure}

$u$, $v$ et $w$  sont les composantes de la vitesse fluctuante (principale et
transverse) dans ce plan, et
$\displaystyle \omega(y,z) = \frac{\partial w}{\partial y}-\frac{\partial v}{\partial z}$
la vorticité dans la direction
normale au plan d'entrée. $\overline{U}(y,z)$ représente ici la vitesse
principale moyenne imposée par l'utilisateur dans le plan d'entrée.

Chaque vortex $p$ va être caractérisé par sa fonction de forme $\xi$ (identique
pour tous les vortex), sa
circulation $\Gamma_p$, son rayon $\sigma_p$ et les coordonnées $(y_p,z_p)$ du
point $P$ où est situé le vortex dans le plan $(0yz)$.

Pour cela, on suppose que la vorticité générée par un vortex $p$ au point $M$ de
coordonnée $(y,z)$ s'écrit :
\begin{equation}\notag
\omega_p(y,z)= \Gamma_p \, \xi_{\sigma_p}(r)
\end{equation}
où $r = \sqrt{(y-y_p)^2+(z-z_p)^2}$ est la distance séparant le point $M$ du point $P$.

Dans la méthode implantée, la fonction de forme est de type gaussienne modifiée :
\begin{equation}\notag
\displaystyle
\xi_\sigma (r) = \frac{1}{2\pi \sigma^2}
\left(2 e^{-\frac{r^2}{2\sigma^2}}-1\right) e^{-\frac{r^2}{2\sigma^2}}
\end{equation}

Le champ de vitesse induit par cette distribution de vorticité s'obtient par
inversion des deux équations de poisson suivantes qui sont déduites de la
condition d'incompressibilité dans la plan\footnote{\textit{i.e}
$\displaystyle \frac{\partial v}{\partial y}+\frac{\partial w}{\partial w} = 0$} :
\begin{equation}\notag
\begin{array}{lcr}
\displaystyle
\frac{\partial \omega}{\partial y} = \Delta w
&
\text{    et    }
&
\displaystyle
\frac{\partial \omega}{\partial y} = -\Delta v
\\
\end{array}
\end{equation}

Dans le cas général, ce système peut être intégré à l'aide de la formule de Biot et Savart.

Dans le cas d'une distribution de vorticité de type gaussienne modifiée, les
composantes de vitesse vérifient :
\begin{equation}\notag
\left\{
\begin{array}{c}
\displaystyle
v_p(y,x) = - \frac{1}{2\pi} \frac{(z-z_p)}{r^2}\left(1 -
e^{-\frac{r^2}{2\sigma^2}}\right)\,e^{-\frac{r^2}{2\sigma^2}}
\\
\displaystyle
w_p(y,z) = \frac{1}{2\pi} \frac{(y-y_p)}{r^2}\left(1 -e^{-\frac{r^2}{2\sigma^2}}
\right)\,e^{-\frac{r^2}{2\sigma^2}}
\end{array}
\right.
\end{equation}

Ces relations s'étendent de façon immédiate au cas de $N$ vortex distincts.
Le champ de vitesse induit par la distribution de vorticité
\begin{equation}
\omega(y,z) = \sum_{p=1}^N \Gamma_p \, \xi_{\sigma_p}(r)
\end{equation}
vaut au point $M$ :
\begin{equation}\notag
\begin{array}{lcr}
v(x,y) = \sum_{p=1}^N \Gamma_p\, v_p(y,z)
&
\text{    et    }
&
w(y,z) = \sum_{p=1}^N \Gamma_p\, w_p(y,z)
\\
\label{Base_Vortex_compvit}
\end{array}
\end{equation}
%================================
\subsection*{Paramètres physiques}
%================================

%-------------------------------
\subsubsection*{Marche en temps}
%-------------------------------
La position initiale de chaque vortex est tirée de manière aléatoire. On calcul
les déplacements successifs de chacun des vortex dans le plan d'entrée par
intégration explicite du champ de vitesse lagrangien :
\begin{equation}\notag
\begin{array}{lcr}
\displaystyle
\frac{dy_p}{dt} = V(y,z)
&
\text{    et    }
&
\displaystyle
\frac{dz_p}{dt} = W(y,z)
\\
\end{array}
\end{equation}
Les vortex sont alors assimilés à des particules ponctuelles qui sont convectées
par le champ $(V,W)$. Ce champ peut être imposé par des tirages aléatoires ou
bien déduit de la vitesse induite par les vortex dans le plan d'entrée. Dans ce
cas $V(x,y) = \overline{V}(y,z) + v (y,z)$ et $W(y,z)= \overline{W}(y,z) +
w(y,z)$ où $\overline{V}$ et $\overline{W}$ sont les composantes de la vitesse
transverse moyenne qu'impose l'utilisateur à l'aide des fichiers de données.

%---------------------------------------------------
\subsubsection*{Intensité et durée de vie des vortex}
%---------------------------------------------------
Il serait possible, à partir de l'équation de transport de la vorticité,
d'obtenir un modèle d'évolution pour l'intensité du vecteur tourbillon
$\omega_p$ associé à chacun des vortex. En pratique, on préfère utiliser un
modèle simplifié dans lequel la circulation des tourbillons ne dépend que de la
postion de ces derniers à l'instant considéré. La circulation initiale de chaque
vortex est alors obtenue à partir de la relation :
\begin{equation}\notag
|\Gamma_p| = 4 \sqrt{\frac{\pi\,S\,k}{3N\,[2ln(3)-3ln(2)]}}
\end{equation}
où $S$ est la surface du plan d'entrée, $N$ le nombre de vortex, et $k$
l'énergie cinétique turbulente au point où se trouve le vortex à l'instant
considéré. Le signe de $\Gamma_p$ correspond au sens de rotation du vortex et
est tiré aléatoirement.

Ce paramètre est celui qui contrôle l'intensité des fluctuations. Sa dépendance
en $k$ exprime que, plus l'écoulement est turbulent, plus les vortex sont
intenses. La valeur de $k$ est spécifiée par
l'utilisateur. Elle peut être constante ou imposée à partir de profils d'énergie
cinétique turbulente en entrée.

Pour éviter que des structures trop allongées ne se développent au niveau de
l'entrée, l'utilisateur doit également spécifier un temps limites $\tau_p$ au
bout duquel le vortex $p$ va être détruit. Ce temps $\tau_p$ peut être pris
constant ou estimé au moyen de la relation :
\begin{equation}\notag
\tau_p = \frac{5 C_{\mu}k^{\frac{3}{2}}}{\varepsilon\,\overline{U}}
\end{equation}

$\overline{U}$ et $\varepsilon$ représentent respectivement la vitesse moyenne
principale et la dissipation turbulente au point où est initialement généré le
vortex ($C_{\mu}=0,09$).
\\
Lorsque le temps écoulé depuis la création du vortex $p$ est supérieur à
$\tau_p$, le vortex est détruit et un nouveau vortex généré (sa position et le
signe de $\Gamma_p$ sont tirés de façon aléatoire).

%--------------------------------
\subsubsection*{Taille des vortex}
%--------------------------------
La taille des vortex peut être prise constante, ou calculée à partir des
relations :
\begin{equation}\notag
\begin{array}{ccc}
\displaystyle
\sigma = \frac{C_{\mu}^{\frac{3}{4}}k^{\frac{3}{2}}}{\varepsilon}
& \text{    ou    } &
\sigma = max[L_t,L_k]
\\
\end{array}
\end{equation}
avec:
\begin{equation}\notag
\begin{array}{ccc}
\displaystyle
L_t = \sqrt{\left( \frac{5 \nu k}{\varepsilon} \right)}
& \text{    et    } &
\displaystyle
L_k = 200\, \left(\frac{\nu^3}{\varepsilon}\right)^{\frac{1}{4}}
\end{array}
\end{equation}
où $\nu$, $k$ et $\varepsilon$ sont la viscosité dynamique, l'énergie cinétique
turbulente et la dissipation turbulente au point où se trouve le vortex.

Dans tous les cas, la taille du vortex doit être supérieure à la taille des
mailles en entrée afin que le vortex soit effectivement simulé.

%==================================
\subsection*{Conditions aux limites}
%==================================
Le champ de vitesse généré à l'aide de la relation \ref{Base_Vortex_compvit} ne tient pas
compte {\em a priori} des conditions aux limites appliquées sur les bords du plan
d'entrée. Pour obtenir des valeurs de la vitesse qui soient cohérentes sur les
frontières du domaine d'entrée, des ``vortex images'', pseudo-vortex situés en
dehors du domaine d'entrée, sont générés à des positions particulières et leur
champ de vitesse associé est superposé au champ précédemment calculé.\\
Seuls les cas d'une conduite rectangulaire et d'une conduite circulaire
permettent la génération de ces pseudo-vortex.
On distingue pour cela trois types de conditions aux limites.

\begin{figure}[h]
\centerline{\includegraphics[height=6cm]{condlimite}}
\caption{\label{Base_Vortex_condli} Principe de génération des ``vortex images'' suivant le
type de conditions aux limites dans une conduite carrée.}
\end{figure}

%----------------------------------
\subsubsection*{Condition de paroi}
%----------------------------------
On crée, pour chaque vortex $P$ contenu dans le plan d'entrée, un vortex image
$P'$ identique à $P$ (\textit{i.e} de même caractéristiques) et symétrique de $P$
par rapport au
point $J$ ($J$ étant la projection orthogonalement à la paroi du point $M$
correspondant au centre de la face où l'on cherche à calculer la vitesse). La
figure \ref{Base_Vortex_condli} illustre la technique dans le cas d'une conduite
carrée. Dans ce cas les coordonnées du vortex situé en $P'$ vérifient
$(y_{p'}+y_{p})/2 = y_{J}$ et $(z_{p'}+ z_{p})/2 = z_{J}$. Le champ de vitesse
perçu depuis le point $M$ au niveau du point $J$ est nul, ce qui est bien
l'effet recherché.

%------------------------------------
\subsubsection*{Condition de symétrie}
%-------------------------------------
La technique est identique à celle utilisée pour les conditions de paroi, mais
seule la composante pour la vitesse normale au bord est modifiée dans ce cas.

%---------------------------------------
\subsubsection*{Condition de périodicité}
%---------------------------------------
On crée pour chaque vortex, un vortex images $P'$ identique à $P$ mais translaté
d'une quantité $L$ correspondant à la longueur qui sépare les deux plans de la
section d'entrée où sont appliquées les conditions de périodicité. Dans le cas
où il y a deux directions de périodicité, on crée deux vortex image.

%=============================================
\subsection*{Composante de vitesse principale}
%=============================================
La méthode des vortex ne générant pas de fluctuation $u$ de la vitesse dans la
direction principale, la dernière composante est calculée à partir d'une
équation de Langevin. Les coefficients de cette équation sont déterminés par
identification des expressions obtenues pour les contraintes de Reynolds en
$R_{ij}-\varepsilon$. Dans le cas d'un écoulement en canal plan, cette technique
conduit à l'équation :
\begin{equation}\notag
\displaystyle
\frac{du}{dt} = - \frac{C_1}{2T} u + \left(\frac{2}{3}C_2-1\right)\frac{\partial
U}{\partial y} v + \sqrt{C_0\varepsilon} dW_i
\end{equation}

avec $\displaystyle T=\frac{k}{\varepsilon}$, $C_1 = 1,8$, $C_2 = 0,6$,
$C_0=\frac{14}{15}$, et $dW_i$ une variable alétoire Gaussienne de variance
$\sqrt{dt}$.

En pratique, l'équation de Langevin n'améliore pas vraiment les résultats. Elle
n'est utilisée que dans le cas de conduites circulaires.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section*{Mise en \oe uvre}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


\begin{itemize}
\item[$\star$] Aprés une étape de préparation de la mémoire (\fort{memvor}), on
repère dans \fort{usvort} les faces d'entrée pour lesquelles la méthode va être
utilisée.
\item[$\star$] Vérification des dimensions rentrées (\fort{vervor}).
\\
\item[$\star$] Le sous-programme \fort{vorpre} se charge ensuite de préparer le
calcul (transmission de la géométrie des entrées à tous les processeurs en cas
de parallélisme, et construction d'un tableau de connectivité). Le
sous-programme procède ainsi :
\\
\begin{itemize}

\item[$\bullet$] On compte, pour chaque entrée \var{IENT}, le nombre de faces où
est appliquée la méthode. Celui-ci est stocké dans le tableau
\var{ICVOR(IENT)}. Un passage dans la sous-routine \fort{memvor} (avec
\var{IAPPEL = 2}) permet d'allouer la mémoire nécessaire à cette phase de
préparation.

\item[$\bullet$] Pour chaque processeur, on stocke les coordonnées des faces
d'entrée repérées précédemment dans les tableaux de travail
\var{RA(IW1X),RA(IW1Y),RA(IW1Z),...}

\item[$\bullet$]  On regarde ensuite pour chaque processeur (boucle
\var{IPROC=1, NRANGP-1}), si le processeur \var{IPROC} a des données à envoyer
aux autres processeurs (afin que tous disposent des coordonnées).
\begin{itemize}
\item Si c'est le cas : \var{ICVOR(IENT)>0}, et on place les données à envoyer
dans les tableaux de travail \var{RA(IW2X),RA(IW2Y),RA(IW2Z),...}. La valeur
\var{NCOMV = ICVOR(IENT)} correspond alors à la longueur des tableaux à envoyer.
\item Sinon, on ne fait rien et \var{NCOM=0}.
\end{itemize}
\item[$\bullet$] Le processeur numéro \var{IPROC} distribue à tous les autres
processeurs la valeur \var{NCOM}. Si \var{NCOM > 0}, il envoie également les
données contenues dans les tableaux de travails \var{RA(IW2X),...}. Ces données
sont ensuite stockées par tous les processeurs dans les tableaux
\var{RA(IXYZV+III),...} afin de libérer les tableaux de travail pour la
communication suivante, et l'indice \var{III = III + NCOM} est incrémenté de
manière à ranger les valeurs de façon chronologique.
\\\\
$\rightarrow$ Au final de la boucle sur \var{IPROC}, chaque processeur dispose
des coordonnées des faces d'entrée pour lesquelles la méthode va être utilisée,
et il est donc simple de construire la connectivité.
\\
\item[$\bullet$] Construction de la connectivité. Au final, la vitesse au centre
de la \var{II} éme face d'entrée utilisant la méthode est contenue à la
\var{IA(IIFAGL+II)} ème ligne du tableau \var{RA(IUVORT)}.

\item[$\bullet$] La routine se termine par un appel au sous-programme
\fort{memvor} ( avec \var{IAPPEL = 3}) afin de réserver la mémoire utile à la
méthode des vortex.
\end{itemize}
\end{itemize}
\bigskip

Cette phase d'initialisation est réalisée une seule fois au début du
calcul. C'est après cette phase seulement que commence la méthode des vortex
proprement dite.
\\
\begin{itemize}
\item[$\star$] Initialisation des variables avant intervention utilisateur (\fort{inivor}).
\item[$\star$] Appel au sous-programme utilisateur \fort{usvort} (\var{IAPPEL = 2}).
\item[$\star$] Vérification des paramètres rentrés (\fort{vervor}).
\item[$\star$] Calcul de la vitesse par la méthode des vortex (\fort{vortex})
\begin{itemize}
\item[$\bullet$] Initialisation du calcul génération du champ initial par appel
au sous-programme \fort{vorini} :

\begin{itemize}
\item Construction du repére local (et calcul de l'équation du plan d'entrée
suivant les cas), localisation du centre de l'entrée, et transformation des
coordonnées de l'entrée dans le repère local. Les tableaux \var{YZCEL(II,1)} et
\var{YZCEL(II,2)} contiennent les coordonnées des faces du plan d'entrée une
fois ramenées dans le repère $(0yz)$ (\var{II} est compris entre 1 et
\var{NCEVOR} où \var{NCEVOR}=\var{ICVOR} représente le nombre de faces pour
lesquelles la méthode va être utilisée a cette entrée).
\item Lecture du fichier de données, et initialisation des tableaux \var{XDAT},
\var{YDAT}, \var{UDAT}, \var{VDAT}, \var{WDAT}, \var{DUYDAT}, \var{KDAT},
\var{EPSDAT}, ...
\item Si on ne fait pas de suite (\var{ISUIVO=0}) ou que l'on réinitialise le
calcul (\var{INITVO=1}), tirage aléatoire de la position des vortex et de leur
sens de rotation, ainsi que calcul de leur durée de vie. Les positions sont
stockées dans les tableaux \var{YZVOR(IVOR,1)} et \var{YZVOR(IVOR,2)}
(\var{IVOR} désignant le numéro du vortex).
\item Stockage de la vitesse principale moyenne au centre de la cellule dans le
tableau \var{XU}, et recherche pour chaque vortex, de la face d'entrée qui lui
est la plus proche.
\end{itemize}

\item[$\bullet$] Déplacement des vortex par appel au sous-programme \fort{vordep} :
\begin{itemize}
\item Convection des vortex.
\item Traitement des conditions aux limites. Les vortex qui sortent du domaine
de calcul sont replacés à leur position d'origine.
\item Régénération des vortex ``morts''. Si le temps de vie cumulé
\var{TEMPS(II)} du vortex \var{II} est supérieur à sont temps de vie limite
\var{TPSLIM(II)}, alors le vortex est détruit, et un nouveau vortex est généré.
\item Recherche pour chaque vortex de la face d'entrée qui lui est la plus
proche après déplacement (mise à jour du tableau \var{IVORCE}).
\end{itemize}

\item[$\bullet$] Calcul du champ de vitesse induit par appel au sous-programme \fort{vorvit} :
\begin{itemize}
\item Calcul de l'intensité du vortex.
\item Calcul de la taille du vortex.
\item Calcul du champ de vitesse induit par l'ensemble des vortex au centre des
faces d'entrée.
\item Traitement suivant les cas, des conditions de périodicité de symétrie et
des conditions de paroi par génération de vortex images.
\item Ajout de la vitesse moyenne dans les directions transverse aux tableaux
\var{XV} et \var{XW}.
\end{itemize}

\item[$\bullet$] Génération des fluctuations de vitesse dans la direction
principale par appel au sous-programme \fort{vorlgv}.
\end{itemize}

\item[$\star$] appel au sous-programme \fort{vor2cl} :
\item[$\bullet$] Communication en cas de parallélisme de la vitesse calculée en
entrée par le processeur 0 aux autres processeurs.
\item[$\bullet$] Application des conditions aux limites après utilisation d'un
changement de repère éventuel.
\end{itemize}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section*{Points \`a traiter}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Il serait possible de gagner de la mémoire en liberant l'espace aloué aux
tableaux \var{IW1X},...,\var{IW2V} après le passage dans \fort{vorpre}.
