Skip to content
Snippets Groups Projects
Commit 2e5170b2 authored by Lionel GUEZ's avatar Lionel GUEZ
Browse files

Polish

parent 211b152a
No related branches found
No related tags found
No related merge requests found
...@@ -2,7 +2,7 @@ degeneracy.pdf ...@@ -2,7 +2,7 @@ degeneracy.pdf
regions.pdf regions.pdf
periodicity.pdf periodicity.pdf
copy.pdf copy.pdf
set_all_outerm.pdf set_contours.pdf
elapsed_time.pdf elapsed_time.pdf
SHPC.pdf SHPC.pdf
plot_test_output.pdf plot_test_output.pdf
......
objects = degeneracy.pdf periodicity.pdf copy.pdf set_all_outerm.pdf \ objects = degeneracy.pdf periodicity.pdf copy.pdf set_contours.pdf \
SHPC.pdf plot_test_output.pdf slice.pdf nearby_extr.pdf descending.pdf SHPC.pdf plot_test_output.pdf slice.pdf nearby_extr.pdf descending.pdf
%.pdf: %.odg %.pdf: %.odg
......
...@@ -93,12 +93,18 @@ tourbillons avec un indice de date. Le programme ne peut pas en ...@@ -93,12 +93,18 @@ tourbillons avec un indice de date. Le programme ne peut pas en
général définir cet indice à partir du fichier d'entrée. L'indice de général définir cet indice à partir du fichier d'entrée. L'indice de
date est donc une entrée supplémentaire du programme. date est donc une entrée supplémentaire du programme.
Les extremua sont parcourus en les triant d'abord par orientation,
puis pour chaque orientation par valeur de SSH. Pour le tri par
orientation, les cyclones sont en premier. Pour les cyclones, les
extremums sont triés par ordre de SSH décroissante. Pour les
anticyclones, les extremums sont triés par ordre de SSH croissante.
Cf. algorithme \ref{alg:principal}. Cf. algorithme \ref{alg:principal}.
\begin{algorithm} \begin{algorithm}
\begin{algorithmic} \begin{algorithmic}
\STATE entrer(corner, step, ssh, u, v) \STATE entrer(corner, step, ssh, u, v)
\STATE appel de set\_all\_extr(s, step, ssh, corner) \STATE appel de set\_all\_extr(s, step, ssh, corner)
\FOR{e dans s\%list par ordre d'orientation et de SSHde l'extremum} \FOR{e dans s\%list par ordre d'orientation et de SSH de l'extremum}
\STATE llc, urc = bbox à $\pm$ max\_radius, dans l'espace des indices \STATE llc, urc = bbox à $\pm$ max\_radius, dans l'espace des indices
\STATE outside\_points = coordonnées des extremums dans llc, urc à éviter \STATE outside\_points = coordonnées des extremums dans llc, urc à éviter
...@@ -111,6 +117,75 @@ Cf. algorithme \ref{alg:principal}. ...@@ -111,6 +117,75 @@ Cf. algorithme \ref{alg:principal}.
\label{alg:principal} \label{alg:principal}
\end{algorithm} \end{algorithm}
Notons ici :
\begin{align*}
& u = \mathtt{urc(1)} \\
& l = \mathtt{llc(1)} \\
& s = \mathtt{step(1)} \\
& e = \mathtt{s\%list\_vis(i)\%coord\_extr(1)} \\
& w = \mathtt{corner\_window(1)} \\
& m = \mathtt{max\_radius(1)}
\end{align*}
Cf. figure (\ref{fig:set_contours}).
\begin{figure}
\centering
\includegraphics{set_contours}
\caption[Contrainte sur les longitudes dans
set\_contours]{Contrainte sur les longitudes dans
set\_contours. Les valeurs en vert sont dans l'espace des
indices, les valeurs en noir dans l'espace des longitudes.}
\label{fig:set_contours}
\end{figure}
Pour que la contrainte de domaine de longitudes dans \verb+get_1_outerm+
soit satisfaite, il faut que, dans set\_contours, au moment de
l'appel à \verb+get_1_outerm+ :
\begin{equation}
\label{eq:max_radius}
(u - l) s < \pi
\end{equation}
et que $e$ et outside\_points(1, :) soient dans l'intervalle
$[w, w + (u - l) s]$. Pour que l'inégalité (\ref{eq:max_radius}) soit
satisfaite, il suffit que :
\begin{equation*}
2 m s < \pi
\end{equation*}
ce que nous imposons en amont de l'appel de set\_contours. Si
periodic est vrai alors :
\begin{equation*}
[w, w + (u - l) s] = [e - m s, e + m s]
\end{equation*}
donc $e$ appartient bien à cet intervalle. Si periodic est faux,
$[w, w + (u - l) s]$ peut être plus réduit que $[e - m s, e + m s]$
mais nous savons aussi que $e$ est dans l'intervalle [corner(1),
corner(1) + (nlon - 1) s], donc $e$ est bien toujours dans
$[w, w + (u - l) s]$.
Il reste le problème de outside\_points(1, :). outside\_points(1, :)
contient des coordonnées prises dans s\%list\_vis\%coord\_extr(1). Si
le domaine est périodique et si l'extremum cible est proche en
longitude de corner(1) par exemple alors outside\_points(1, :) peut
contenir des longitudes proches de corner(1) + (nlon - 1) s. Il faut
leur retrancher $2 \pi$. Nous posons le problème plus généralement de
la façon suivante. Soit $\lambda \in \mathbb{R}$. On cherche $k \in
\mathbb{Z}$ tel que :
\begin{equation*}
\lambda + 2 k \pi \in [w, w + (u - l) s]
\end{equation*}
Supposons que $k$ existe (c'est le cas si $\lambda$ est une longitude
retournée par nearby\_extr). Alors $k$ est unique (cf. propriété
(\ref{eq:length_pi})). On a :
\begin{equation*}
\lambda + 2 k \pi \in [w, w + 2 \pi[
\end{equation*}
C'est-à-dire :
\begin{equation*}
k - 1 < \frac{w - \lambda}{2 \pi} \le k
\end{equation*}
Ou encore :
\begin{equation*}
k = \left\lceil \frac{w - \lambda}{2 \pi} \right\rceil
\end{equation*}
\section{Identification of instantaneous eddies} \section{Identification of instantaneous eddies}
\label{sec:identification} \label{sec:identification}
...@@ -876,7 +951,7 @@ procédures qui appellent les procédures géométriques doivent se ...@@ -876,7 +951,7 @@ procédures qui appellent les procédures géométriques doivent se
charger d'ajouter le multiple de $2 \pi$ pour ramener les longitudes charger d'ajouter le multiple de $2 \pi$ pour ramener les longitudes
dans un intervalle de longueur strictement inférieure à $\pi$. La dans un intervalle de longueur strictement inférieure à $\pi$. La
contrainte de domaine de longitudes s'applique aux procédures contrainte de domaine de longitudes s'applique aux procédures
\verb+get_1_outerm+ et \verb+set_max_speed+. Cf. § \ref{sec:set_all_outerm}. \verb+get_1_outerm+ et \verb+set_max_speed+. Cf. § \ref{sec:set_contours}.
\section{Sous-algorithmes} \section{Sous-algorithmes}
...@@ -1184,39 +1259,8 @@ puisqu'on a initialisé le champ closed à vrai. Cf. figure ...@@ -1184,39 +1259,8 @@ puisqu'on a initialisé le champ closed à vrai. Cf. figure
\label{fig:nearby_extr} \label{fig:nearby_extr}
\end{figure} \end{figure}
\subsection{set\_all\_outerm} \subsection{set\_contours}
\label{sec:set_all_outerm} \label{sec:set_contours}
Les extremums sont parcourus en les triant d'abord par orientation,
puis pour chaque orientation par valeur de SSH. Pour le tri par
orientation, les cyclones sont en premier. Pour les cyclones, les
extremums sont triés par ordre de SSH décroissante. Pour les
anticyclones, les extremums sont triés par ordre de SSH croissante.
Cf. algorithme \ref{alg:set_all_outerm}.
\begin{algorithm}
Déclarations :
\begin{algorithmic}
\STATE donnée-résultat s
\STATE données step, ssh, corner
\end{algorithmic}
Instructions:
\begin{algorithmic}
\FOR{e dans s\%list par ordre d'orientation et de ssh}
\STATE llc, urc = bbox dans l'espace des indices : max\_radius
autour de l'extremum
\STATE outside\_points = coordonnées des extremums dans llc, urc à éviter
\STATE e\%out\_cont = get\_1\_outerm(e\%cyclone, e\%coord\_extr,
innermost\_level, outside\_points, ssh, llc, urc, corner, step)
\ENDFOR
\end{algorithmic}
\caption{subroutine set\_all\_outerm(s, step, ssh, corner)}
\label{alg:set_all_outerm}
\end{algorithm}
Depuis la commission fc7f1bd, on cherche un contour de vitesse Depuis la commission fc7f1bd, on cherche un contour de vitesse
maximale pour chaque tourbillon immédiatement après avoir trouvé son maximale pour chaque tourbillon immédiatement après avoir trouvé son
...@@ -1229,74 +1273,13 @@ les contours dans le snasphot. L'inconvénient est qu'on a perdu de la ...@@ -1229,74 +1273,13 @@ les contours dans le snasphot. L'inconvénient est qu'on a perdu de la
souplesse pour laisser la voie à d'autres processus de recherche des souplesse pour laisser la voie à d'autres processus de recherche des
contours. contours.
Notons ici : On conserve tous les bons contours trouvés lors de la recherche par
\begin{align*} dichotomie du contour extérieur. Ils serviront lors de la recherche du
& u = \mathtt{urc(1)} \\ contour de vitesse maximale. On a une liste de contours triée par
& l = \mathtt{llc(1)} \\ ordre de ssh et on complète la liste de contours pour qu'il y ait un
& s = \mathtt{step(1)} \\ intervalle de ssh maximal entre deux contours successifs. Le projet de
& e = \mathtt{s\%list\_vis(i)\%coord\_extr(1)} \\ compléter la liste justifie que ce tableau ait une taille fixe au lieu
& w = \mathtt{corner\_window(1)} \\ d'être alloué par \verb+get_1_outerm+.
& m = \mathtt{max\_radius(1)}
\end{align*}
Cf. figure (\ref{fig:set_all_outerm}).
\begin{figure}
\centering
\includegraphics{set_all_outerm}
\caption[Contrainte sur les longitudes dans
set\_all\_outerm]{Contrainte sur les longitudes dans
set\_all\_outerm. Les valeurs en vert sont dans l'espace des
indices, les valeurs en noir dans l'espace des longitudes.}
\label{fig:set_all_outerm}
\end{figure}
Pour que la contrainte de domaine de longitudes dans \verb+get_1_outerm+
soit satisfaite, il faut que, dans set\_all\_outerm, au moment de
l'appel à \verb+get_1_outerm+ :
\begin{equation}
\label{eq:max_radius}
(u - l) s < \pi
\end{equation}
et que $e$ et outside\_points(1, :) soient dans l'intervalle
$[w, w + (u - l) s]$. Pour que l'inégalité (\ref{eq:max_radius}) soit
satisfaite, il suffit que :
\begin{equation*}
2 m s < \pi
\end{equation*}
ce que nous imposons en amont de l'appel de set\_all\_outerm. Si
periodic est vrai alors :
\begin{equation*}
[w, w + (u - l) s] = [e - m s, e + m s]
\end{equation*}
donc $e$ appartient bien à cet intervalle. Si periodic est faux,
$[w, w + (u - l) s]$ peut être plus réduit que $[e - m s, e + m s]$
mais nous savons aussi que $e$ est dans l'intervalle [corner(1),
corner(1) + (nlon - 1) s], donc $e$ est bien toujours dans
$[w, w + (u - l) s]$.
Il reste le problème de outside\_points(1, :). outside\_points(1, :)
contient des coordonnées prises dans s\%list\_vis\%coord\_extr(1). Si
le domaine est périodique et si l'extremum cible est proche en
longitude de corner(1) par exemple alors outside\_points(1, :) peut
contenir des longitudes proches de corner(1) + (nlon - 1) s. Il faut
leur retrancher $2 \pi$. Nous posons le problème plus généralement de
la façon suivante. Soit $\lambda \in \mathbb{R}$. On cherche $k \in
\mathbb{Z}$ tel que :
\begin{equation*}
\lambda + 2 k \pi \in [w, w + (u - l) s]
\end{equation*}
Supposons que $k$ existe (c'est le cas si $\lambda$ est une longitude
retournée par nearby\_extr). Alors $k$ est unique (cf. propriété
(\ref{eq:length_pi})). On a :
\begin{equation*}
\lambda + 2 k \pi \in [w, w + 2 \pi[
\end{equation*}
C'est-à-dire :
\begin{equation*}
k - 1 < \frac{w - \lambda}{2 \pi} \le k
\end{equation*}
Ou encore :
\begin{equation*}
k = \left\lceil \frac{w - \lambda}{2 \pi} \right\rceil
\end{equation*}
\subsection{set\_max\_speed} \subsection{set\_max\_speed}
...@@ -1376,7 +1359,7 @@ Cf. figures \ref{fig:cont_double_max} et \ref{fig:speed_double_max}. ...@@ -1376,7 +1359,7 @@ Cf. figures \ref{fig:cont_double_max} et \ref{fig:speed_double_max}.
recherche du contour de vitesse maximale. Test recherche du contour de vitesse maximale. Test
Region\_5\_15\_days, slice 0, anticyclones, date 20456, indice intra-date Region\_5\_15\_days, slice 0, anticyclones, date 20456, indice intra-date
48. Révision 87252df. On voit deux maximums relatifs de vitesse, 48. Révision 87252df. On voit deux maximums relatifs de vitesse,
de valeurs assez proches, à deux abscisse assez différentes.} de valeurs assez proches, à deux abscisses assez différentes.}
\label{fig:speed_double_max} \label{fig:speed_double_max}
\end{figure} \end{figure}
...@@ -1738,7 +1721,7 @@ avec le format PolygonM. Le format GeoJSon n'est pas adapté non plus : ...@@ -1738,7 +1721,7 @@ avec le format PolygonM. Le format GeoJSon n'est pas adapté non plus :
directly inspired GeoJSON and most GIS formats, doesn’t support this directly inspired GeoJSON and most GIS formats, doesn’t support this
notion of attributes-at-positions.}\fg{}. notion of attributes-at-positions.}\fg{}.
Dans \verb+set_all_outerm+, si le domaine considéré n'est pas global, Dans \verb+set_contours+, si le domaine considéré n'est pas global,
comment traiter un tourbillon au bord du domaine ? La taille du comment traiter un tourbillon au bord du domaine ? La taille du
contour le plus extérieur peut être artificiellement diminuée. (Ce contour le plus extérieur peut être artificiellement diminuée. (Ce
n'est pas le même cas qu'un tourbillon près d'une côte.) C'est-à-dire n'est pas le même cas qu'un tourbillon près d'une côte.) C'est-à-dire
...@@ -1788,15 +1771,16 @@ projetée est appelée grille $\rho$. La grille $\psi$ est la grille de ...@@ -1788,15 +1771,16 @@ projetée est appelée grille $\rho$. La grille $\psi$ est la grille de
la vorticité. Le couple de coordonnées dans le plan de projection est la vorticité. Le couple de coordonnées dans le plan de projection est
$(\xi, \eta)$. Il faut de toutes façons se ramener à la même grille $(\xi, \eta)$. Il faut de toutes façons se ramener à la même grille
pour passer des composantes de la vitesse dans l'espace projeté aux pour passer des composantes de la vitesse dans l'espace projeté aux
composantes zonales et méridiennes dans l'espace physique. Le plus composantes zonale et méridienne dans l'espace physique. Le plus
simple est, au moment de la lecture, de ramener les vitesses projetées simple est, au moment de la lecture, de ramener les vitesses projetées
sur la grille de $\zeta$ et de faire la rotation. sur la grille de $\zeta$ et de faire la rotation.
La position en longitude et latitude intervient essentiellement à La position en longitude et latitude intervient dans le programme
travers les variables corner, step et \verb+min_area+. Idée de faire \verb+inst_eddies+ essentiellement à travers les variables corner,
tout le traitement dans l'espace des indices mais la latitude et la step et \verb+min_area+. Idée de faire tout le traitement dans
longitude interviennent dans le calcul de la surface des contours l'espace des indices mais la latitude et la longitude interviennent
(appels à \verb+spher_polyline_area+ dans \verb+get_1_outerm+ et dans le calcul de la surface des contours (appels à
\verb+spher_polyline_area+ dans \verb+get_1_outerm+ et
\verb+set_max_speed+) et dans le calcul de la vitesse moyenne \verb+set_max_speed+) et dans le calcul de la vitesse moyenne
(procédure \verb+mean_speed+). (procédure \verb+mean_speed+).
...@@ -1843,26 +1827,9 @@ Algorithme principal : ...@@ -1843,26 +1827,9 @@ Algorithme principal :
\begin{algorithmic} \begin{algorithmic}
\STATE lire ($\lambda$, $\phi$, ssh, u, v) \STATE lire ($\lambda$, $\phi$, ssh, u, v)
\STATE appel de set\_all\_extr \STATE appel de set\_all\_extr
\STATE appel de set\_all\_contours \STATE appel de set\_contours
\STATE appel de set\_all\_speed
\end{algorithmic} \end{algorithmic}
\verb+set_all_contours+ : remplit s\%list\%cont\_list sauf la
composante speed. Conserver tous les bons contours trouvés lors de la
recherche par dichotomie du contour extérieur. Ils serviront lors de
la recherche du contour de vitesse maximale. Trier la liste de contour
par ordre de ssh et compléter la liste de contours pour qu'il y ait un
intervalle de ssh maximal entre deux contours successifs. Le projet de
compléter la liste justifie que ce tableau ait une taille fixe au lieu
d'être alloué par \verb+get_1_outerm+. L'idée est de créer une
procédure pour compléter la liste, qui serait appelée après
\verb+get_1_outerm+, à l'intérieur de l'itération sur les extremums,
avant affectation de la liste à une composante du type eddy. La
composante \verb+cont_list+ du type eddy serait allocatable.
\verb+set_all_speed+ : remplit s\%list\%i\_max\_speed,
s\%list\%cont\_list\%speed
\verb+get_1_outerm+ : dans l'espace des indices et dans l'espace \verb+get_1_outerm+ : dans l'espace des indices et dans l'espace
$(\lambda, \phi)$. $(\lambda, \phi)$.
......
...@@ -330,7 +330,7 @@ ...@@ -330,7 +330,7 @@
"description": "We are using Inst_eddies_loop, which is a previous test." "description": "We are using Inst_eddies_loop, which is a previous test."
}, },
"Set_all_outerm_periodic": { "Set_all_outerm_periodic": {
"description": "test_set_all_outerm with periodicity.", "description": "inst_eddies with periodicity.",
"create_file": [ "create_file": [
"config_nml.txt", "config_nml.txt",
"&config_nml MAX_RADIUS_deg = 80., 72., min_radius = 20./\n" "&config_nml MAX_RADIUS_deg = 80., 72., min_radius = 20./\n"
......
...@@ -55,7 +55,7 @@ contains ...@@ -55,7 +55,7 @@ contains
type(ssh_contour), intent(out):: cont_list(:) ! (n_max_cont) type(ssh_contour), intent(out):: cont_list(:) ! (n_max_cont)
! Contour list. Defined only for subscripts 1:n_cont. If n_cont >= ! Contour list. Defined only for subscripts 1:n_cont. If n_cont >=
! 1, the outermost contour is element with subscript n_cont. The ! 1, the outermost contour is element with subscript n_cont. The
! contours are in monotonic order of ssh. For i /= n_cont - 1, ! contours are in monotonic order of ssh. For i <= n_cont - 1,
! cont_list(i)%area has its default initialization value and the ! cont_list(i)%area has its default initialization value and the
! order of points in cont_list(i)%polyline (clockwise or ! order of points in cont_list(i)%polyline (clockwise or
! counter-clockwise) is not specified. ! counter-clockwise) is not specified.
......
...@@ -65,7 +65,7 @@ contains ...@@ -65,7 +65,7 @@ contains
type(ssh_contour) cont_list(n_max_cont) type(ssh_contour) cont_list(n_max_cont)
! Contour list. Defined only for subscripts 1:n_cont. If n_cont >= ! Contour list. Defined only for subscripts 1:n_cont. If n_cont >=
! 1, the outermost contour is element with subscript n_cont. The ! 1, the outermost contour is element with subscript n_cont. The
! contours are in monotonic order of ssh. If i /= n_cont - 1, ! contours are in monotonic order of ssh. If i <= n_cont - 1,
! cont_list(i)%area has its default initialization value and the ! cont_list(i)%area has its default initialization value and the
! order of points in cont_list(i)%polyline (clockwise or ! order of points in cont_list(i)%polyline (clockwise or
! counter-clockwise) is not specified. ! counter-clockwise) is not specified.
......
...@@ -44,7 +44,7 @@ contains ...@@ -44,7 +44,7 @@ contains
! Contour list. Defined only for subscripts 1:n_cont. On entry, ! Contour list. Defined only for subscripts 1:n_cont. On entry,
! the outermost contour is element with subscript n_cont. The ! the outermost contour is element with subscript n_cont. The
! contours between 1 and i_outer are in monotonic order of ! contours between 1 and i_outer are in monotonic order of
! ssh. For i /= i_outer, cont_list(i)%area has its default ! ssh. For i < i_outer, cont_list(i)%area has its default
! initialization value and the order of points in ! initialization value and the order of points in
! cont_list(i)%polyline (clockwise or counter-clockwise) is not ! cont_list(i)%polyline (clockwise or counter-clockwise) is not
! specified. ! specified.
......
...@@ -20,9 +20,10 @@ contains ...@@ -20,9 +20,10 @@ contains
use derived_types, only: eddy, shpc_slice_handler, missing_speed use derived_types, only: eddy, shpc_slice_handler, missing_speed
type(eddy), intent(out):: e type(eddy), intent(out):: e
! All components except e%innermost_level and maybe ! All components except e%innermost_level are defined. Component
! e%extr%coord_proj are defined. Components delta_in and delta_out ! e%extr%coord_proj may get its default initialization
! get default initialization values. ! value. Components delta_in and delta_out get default
! initialization values.
integer, intent(out):: d ! date integer, intent(out):: d ! date
integer, intent(out):: i ! eddy index integer, intent(out):: i ! eddy index
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment