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

Reverse change made in commit 569f9e57: constraint on max_radius. I am

not sure about this. I will stay on the safe side for now.

Support periodic grid in successive_overlap.
parent 39095adf
No related branches found
No related tags found
No related merge requests found
......@@ -7,3 +7,4 @@ regions.pdf
window.pdf
periodicity.pdf
copy.pdf
set_all_outerm.pdf
sources = window processes m3 call_graph input_output degeneracy periodicity copy
sources = window processes m3 call_graph input_output degeneracy periodicity copy set_all_outerm
objects := $(addsuffix .pdf, ${sources})
......
File added
......@@ -519,7 +519,7 @@ Les procédures géométriques utilisées :
travaillent dans le plan
et non sur la sphère. Ces procédures sont appelées par :
\begin{itemize}
\item spherical\_polyline\_area
\item spher\_polyline\_area
\item inside\_4
\item good\_contour
\end{itemize}
......@@ -544,7 +544,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
dans un intervalle de longueur strictement inférieure à $\pi$. La
contrainte de domaine de longitudes s'applique aux procédures
\verb+get_1_outerm+ et \verb+set_max_speed+.
\verb+get_1_outerm+ et \verb+set_max_speed+. Cf. § \ref{sec:set_all_outerm}.
\subsection{Sous-algorithmes}
......@@ -656,6 +656,7 @@ Cas de périodicité : field(i + m - 2, :) = field(i, :).
Il manque des tests pour lesquels direction vaut 1 et 4.
\subsubsection{set\_all\_outerm}
\label{sec:set_all_outerm}
Notons ici :
\begin{align*}
......@@ -666,6 +667,15 @@ Notons ici :
& w = \mathtt{corner\_window(1)} \\
& m = \mathtt{max\_radius(1)}
\end{align*}
Cf. figure (\ref{fig:set_all_outerm}).
\begin{figure}[htbp]
\centering
\includegraphics{set_all_outerm}
\caption{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+ :
......@@ -734,7 +744,7 @@ weight à u et v, c'est-à-dire qu'il faudrait conserver u, v à
plusieurs dates en dehors de \verb+get_snpashot+. Cela remettrait en
question tout l'algorithme.
\subsubsection{spherical\_polyline\_area}
\subsubsection{spher\_polyline\_area}
La procédure de calcul des contours donne une suite de sommets. Les
courbes reliant ces sommets ne sont en fait pas imposés
......@@ -971,7 +981,7 @@ Les procédures géométriques utilisées :
\end{itemize}
Ces procédures sont appelées par :
\begin{itemize}
\item spherical\_polyline\_area
\item spher\_polyline\_area
\item \verb+successive_overlap+
\end{itemize}
Cf. discussion autour de l'équation~(\ref{eq:length_pi}).
......@@ -1512,6 +1522,25 @@ dans polygon\_1 et polygon\_2, il faudrait faire des copies de
gagnerait rien en quantité de copie, et on perdrait en mémoire vive
occupée.
Contrainte géométrique : les extremums i1 et i2 doivent être ramenés,
via une modulation de $2 \pi$, à une distance inférieure à $pi$ en
longitude. Si $\lambda_1$ désigne la longitude de l'extremum 1, et
$\lambda$ une longitude quelconque, on cherche $m \in \mathbb{Z}$ tel
que :
\begin{equation*}
|\lambda + 2 m \pi - \lambda_1| < \pi
\end{equation*}
Si $m$ existe (ce qui est le cas pour $\lambda$ correspondant à i2)
alors :
\begin{equation*}
m = E\left(\frac{\lambda_1 - \lambda}{2 \pi} + \frac{1}{2} \right)
\end{equation*}
Dans \verb+set_all_outerm+, le multiple de $2 \pi$ à ajouter aux
longitudes de \verb+outside_points+ peut varier selon le point. Ici,
le multiple de $2 \pi$ à ajouter aux longitudes doit être le même pour
tous les points du contour, et égal au multiple à ajouter à la
longitude de l'extremum i2.
\subsubsection{weight}
D'autant plus proche de 0 que les tourbillons sont
......
......@@ -112,8 +112,9 @@ program extraction_eddies
! "periodic" must be consistent with the values of step(1) and nlon:
periodic = nint(twopi / step(1)) == nlon
print *, "periodic = ", periodic
if (periodic) call assert(2 * max_radius(1) * step(1) < pi, &
"extraction_eddies max_radius")
call assert(2 * max_radius(1) * step(1) < pi, "extraction_eddies max_radius")
! (Let us require this even if not periodic. This is clearer.)
copy = merge(max_radius(1), 0, periodic)
allocate(ssh(1 - copy:nlon + copy, nlat), u(1 - copy:nlon + copy, nlat), &
......
......@@ -17,6 +17,7 @@ contains
! Libraries:
use contour_531, only: polyline
use gpc_f, only: gpc_polygon_clip_f, GPC_INT, polygon
use nr_util, only: twopi
use candidate_overlap_m, only: candidate_overlap
use derived_types, only: snapshot
......@@ -32,7 +33,7 @@ contains
! Local:
integer i1, i2, l, n_select
integer i1, i2, l, n_select, m
type(polyline) polyline_1, polyline_2
type(polygon) res_pol
......@@ -74,6 +75,13 @@ contains
polyline_2 = merge(flow(j)%list_vis(i2)%speed_cont%polyline, &
flow(j)%list_vis(i2)%out_cont%polyline, &
flow(j)%list_vis(i2)%speed_cont%n_points /= 0)
! Shift the longitudes of polyline_2 to values close to the
! longitude of extremum i1:
m = floor((flow(j - 1)%list_vis(i1)%coord_extr(1) &
- flow(j)%list_vis(i2)%coord_extr(1)) / twopi + 0.5)
polyline_2%points(1, :) = polyline_2%points(1, :) + m * twopi
call gpc_polygon_clip_f(GPC_INT, polygon(nparts = 1, &
part = [polyline_1], hole = [.false.]), &
polygon(nparts = 1, part = [polyline_2], hole = [.false.]), &
......
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