diff --git a/Documentation_texfol/Graphiques/window.odg b/Documentation_texfol/Graphiques/window.odg index 61ff61792cbf4325f84c1494feb0b7c838e2dea7..796513de4a607d94614fdef78abd61f9884993dc 100644 Binary files a/Documentation_texfol/Graphiques/window.odg and b/Documentation_texfol/Graphiques/window.odg differ diff --git a/Documentation_texfol/documentation.tex b/Documentation_texfol/documentation.tex index 8fb48e705d8f6efeca232094aef2c69585163847..7b44ad308e135f2061ba8e04b32e62439695e16c 100644 --- a/Documentation_texfol/documentation.tex +++ b/Documentation_texfol/documentation.tex @@ -68,18 +68,31 @@ l'amplitude minimale. Même si un contour extérieur est trouvé (avec une amplitude supérieure à l'amplitude minimale par construction), il peut ne pas être valide à cause du critère de surface minimale. -Le champ speed de extremum.dbf vaut \verb+missing_speed+ si et -seulement si radius4 == 0 ou \verb+speed_outerm+ dans -\verb+set_max_speed+ est NaN. Si radius4 $\ge$ 2 et speed dans +\begin{tabular}{p{5cm}cp{5cm}} + \hline + Le champ speed de extremum.dbf vaut \verb+missing_speed+ + & $\Leftrightarrow$ & + radius4 == 0 ou \verb+speed_outerm+ dans \verb+set_max_speed+ est NaN \\ + \hline +\end{tabular} + +Si radius4 $\ge$ 2 et speed dans extremum.dbf vaut \verb+missing_speed+ alors \verb+speed_outerm+ dans -\verb+set_max_speed+ est NaN, \verb+e%speed_cont+ est -non vide dans \verb+max_speed_contour.shp+ et \verb+mean_speed+ sur +\verb+set_max_speed+ est NaN, la forme est non vide dans +\verb+max_speed_contour.shp+ et \verb+mean_speed+ sur \verb+e%speed_cont+ a donné un NaN. En d'autres termes, les deux appels à \verb+mean_speed+ ont tous les deux produit un -NaN. (\verb+e%speed_cont+ est -non vide dans \verb+max_speed_contour.shp+ et speed dans extremum.dbf -vaut \verb+missing_speed+) si et seulement si (radius4 $\ge$ 2 et -speed dans extremum.dbf vaut \verb+missing_speed+). +NaN. + +\begin{tabular}{p{5cm}cp{5cm}} + \hline + La forme est non vide dans \verb+max_speed_contour.shp+ et + speed dans extremum.dbf vaut \verb+missing_speed+ + & $\Leftrightarrow$ + & radius4 $\ge$ 2 et speed dans extremum.dbf vaut + \verb+missing_speed+ \\ + \hline +\end{tabular} Cas où les composantes \verb+out_cont+ ou \verb+speed_cont+ d'un tourbillon sont vides, c'est-à -dire égales à @@ -103,8 +116,8 @@ tableau (\ref{tab:null_ssh_contour}). vide. Colonne fraction : pour la région 5, nombre de cas sur 260 extremums au total. Note 1 : pas de bon contour à innermost\_level. Note 2 : out\_cont est près d'une côte, champ de - vitesse non défini, max\_speed vaut $10^4$ dans le fichier - DBF. Note 3 : pas mieux que out\_cont pour la vitesse maximale.} + vitesse non défini, speed vaut $10^4$ dans le fichier DBF. Note 3 + : pas mieux que out\_cont pour la vitesse maximale.} \label{tab:null_ssh_contour} \end{table} Sur la région 5, sur 260 extremums, je trouve les nombres de cas @@ -325,16 +338,16 @@ cas pathologiques. Format shapefile. Un type de géométrie par fichier donc il faut séparer les contours et les positions des extremums. \begin{itemize} -\item \verb+extremum_$m.shp+ : points -\item \verb+extremum_$m.dbf+ +\item \verb+extremum.shp+ : points +\item \verb+extremum.dbf+ : valeur de SSH, indice de date, indice de tourbillon à cette date, interpolé (logique), cyclone (logique), valid (logique), valeur de vitesse sur le contour de vitesse maximale -\item \verb+outermost_contour_$m.shp+ : polygones -\item \verb+outermost_contour_$m.dbf+ : aire, valeur de SSH, indice de +\item \verb+outermost_contour.shp+ : polygones +\item \verb+outermost_contour.dbf+ : aire, valeur de SSH, indice de date, indice de tourbillon à cette date, radius4 -\item \verb+max_speed_contour_$m.shp+ : polygones -\item \verb+max_speed_contour_$m.dbf+ +\item \verb+max_speed_contour.shp+ : polygones +\item \verb+max_speed_contour.dbf+ : aire, valeur de SSH, indice de date, indice de tourbillon à cette date \end{itemize} @@ -342,19 +355,19 @@ Soit un total de 9 fichiers par processus en comptant les fichiers shx. valid == 1 dans le fichier -\verb+extremum_$m.dbf+ signifie qu'un contour extérieur a été trouvé +\verb+extremum.dbf+ signifie qu'un contour extérieur a été trouvé et qu'il a une surface suffisante. Si un contour extérieur est bien défini (non vide) alors il a par construction une amplitude supérieure à \verb+min_amp+. -Si une forme dans \verb+max_speed_contour_$m.shp+ est non vide alors -la vitesse correspondante dans \verb+extremum_$m.dbf+ est la vitesse +Si une forme dans \verb+max_speed_contour.shp+ est non vide alors +la vitesse correspondante dans \verb+extremum.dbf+ est la vitesse sur cette forme. L'indice de date et l'indice de tourbillon dans -\verb+outermost_contour_$m.dbf+ et \verb+max_speed_contour_$m.dbf+ +\verb+outermost_contour.dbf+ et \verb+max_speed_contour.dbf+ sont en principe inutiles puisqu'ils sont aussi dans -\verb+extremum_$m.dbf+ et que les tourbillons sont stockés dans le +\verb+extremum.dbf+ et que les tourbillons sont stockés dans le même ordre dans les trois shapefiles. La redondance me semble préférable pour la solidité et le confort d'utilisation. @@ -1054,17 +1067,21 @@ Nous avons besoin que la composante extr\_map de snapshot soit étendue en longitude dans le cas d'un domaine périodique pour son utilisation par \verb+successive_overlap+. -Les tailles ci-dessous sont calculées pour \verb+max_delta+ = 4 et une -durée de 16 ans, soit environ 5000 dates. \begin{description} \item[max\_delta] Scalaire entier. Intervalle maximal d'indices de dates auxquelles on cherche des recouvrements. Normalement 4. -\item[flow] : Vecteur de type snapshot, de taille \verb+max_delta+ + 1, - chaque élément correspondant à une date. Environ 40 MiB. +\item[flow] : Vecteur de type snapshot, de taille \verb+max_delta+ + + 1, chaque élément correspondant à une date. Environ 40 MiB pour + \verb+max_delta+ = 4. \item[dist\_lim] Scalaire entier constant, = 3° / résolution. \item[weight\_delta] Scalaire réel. \end{description} +On doit stocker dans le champ number\_eddies le nombre de tourbillons +parce qu'on peut refaire des interpolations à une même date dans +différents appels à non\_successive\_overlap : il faut que le numéro +de tourbillon interpolé soit bien incrémenté. + i désigne un indice de tourbillon, j un indice de position dans la fenêtre temporelle (entre 1 et \verb+max_delta+ + 1) et k un indice de date. Cf. figure (\ref{fig:window}) et algorithme @@ -1092,7 +1109,7 @@ date. Cf. figure (\ref{fig:window}) et algorithme \ENDFOR \FOR{k = 2 \TO max\_delta + 1} - \STATE appel de successive\_overlap(k, k, flow) + \STATE appel de successive\_overlap(flow, k, k) \ENDFOR \FOR{delta = 2 \TO max\_delta} @@ -1112,7 +1129,7 @@ date. Cf. figure (\ref{fig:window}) et algorithme \STATE appel de get\_snapshot(flow(max\_delta + 1), k) - \STATE appel de successive\_overlap(max\_delta + 1, k, flow) + \STATE appel de successive\_overlap(flow, max\_delta + 1, k) \FOR{delta = 2 \TO max\_delta} @@ -1173,10 +1190,17 @@ Nombre d'appels à \verb+non_successive_overlap+ dans le prologue : \end{equation*} Dans la boucle principale : (\verb+max_delta+ - 1)(\verb+k_end_main_loop+ - \verb+k_begin+ - \verb+max_delta+). Dans l'épilogue, si m < \verb+n_proc+ : -$\frac{\mathtt{max\_delta} (\mathtt{max\_delta} - 1)}{2}$. Total si m -< \verb+n_proc+ : (\verb+max_delta+ - 1)(k\_end - \verb+k_begin+ - \verb+max_delta+ + -1). Total si m = \verb+n_proc+ : (\verb+max_delta+ - 1)(k\_end - \verb+k_begin+ - -$\frac{\mathtt{max\_delta}}{2}$). +\begin{equation*} + \frac{\mathtt{max\_delta} (\mathtt{max\_delta} - 1)}{2} +\end{equation*} +Total si m < \verb+n_proc+ : (\verb+max_delta+ - 1)(k\_end - +\verb+k_begin+ - \verb+max_delta+ + 1). Total si m = \verb+n_proc+ : +\begin{equation*} + (\mathtt{max\_delta} - 1) + \left( + \mathtt{k\_end} - \mathtt{k\_begin} - \frac{\mathtt{max\_delta}}{2} + \right) +\end{equation*} Si k\_end - \verb+k_begin+ était le même pour m = \verb+n_proc+ et m < \verb+n_proc+, le processus m=\verb+n_proc+ aurait des plus grands nombres @@ -1280,10 +1304,11 @@ Exemples : cf. tableaux (\ref{tab:m2}) et (\ref{tab:m3}) et figure \begin{figure}[htbp] \centering \includegraphics[width=\textwidth]{m3} - \caption{max\_delta = 4, n\_dates = 15, n\_proc = 3. En bleu le - prologue, en noir la boucle principale, en rouge l'épilogue. Pour - un processus donné, les actions sur une même colonne sont dans une - même boucle de l'algorithme principal.} + \caption{max\_delta = 4, n\_dates = 15, n\_proc = 3. Les numéros + sont les indices de date. En bleu le prologue, en noir la boucle + principale, en rouge l'épilogue. Pour un processus donné, les + actions sur une même colonne sont dans une même boucle de + l'algorithme principal.} \label{fig:m3} \end{figure} @@ -1342,7 +1367,7 @@ un seul processus. \ENDFOR \FOR{k = k\_begin + 1 \TO k\_begin + max\_delta} - \STATE appel de successive\_overlap(k - k\_begin + 1, k, flow) + \STATE appel de successive\_overlap(flow, k - k\_begin + 1, k) \ENDFOR \FOR{delta = 2 \TO max\_delta} @@ -1364,7 +1389,7 @@ un seul processus. \STATE appel de get\_snapshot(flow(max\_delta + 1), k) - \STATE appel de successive\_overlap(max\_delta + 1, k, flow) + \STATE appel de successive\_overlap(flow, max\_delta + 1, k) \FOR{delta = 2 \TO max\_delta} @@ -1446,7 +1471,7 @@ flow(j)\%list\_vis\%delta\_in, flow\%number\_eddies. Cf. algorithme \STATE polygon\_1 = merge(flow(j - delta)\%list\_vis(i1)\%speed\_cont\%polyline, flow(j - delta)\%list\_vis(i1)\%out\_cont\%polyline, flow(j - - delta)\%list\_vis(i1)\%max\_speed $\ne$ 0) + delta)\%list\_vis(i1)\%speed\_cont\%n\_points $\ne$ 0) \STATE i1\_lon = flow(j - delta)\%ind\_extr(1, i1) @@ -1465,7 +1490,7 @@ flow(j)\%list\_vis\%delta\_in, flow\%number\_eddies. Cf. algorithme \STATE polygon\_2 = merge(flow(j)\%list\_vis(i2)\%speed\_cont\%polyline, flow(j)\%list\_vis(i2)\%out\_cont\%polyline, - flow(j)\%list\_vis(i2)\%max\_speed $\ne$ 0) + flow(j)\%list\_vis(i2)\%speed\_cont\%n\_points $\ne$ 0) \IF{polygon\_1 et polygon\_2 se recouvrent} @@ -1525,7 +1550,7 @@ 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 +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 : diff --git a/derived_types.f90 b/derived_types.f90 index ffec692525959191f0123b67764398cee6b6bd37..38704ad6de867dd64d18dc0ce8ef89d687ec6140 100644 --- a/derived_types.f90 +++ b/derived_types.f90 @@ -17,7 +17,9 @@ module derived_types logical cyclone type(ssh_contour) out_cont ! outermost contour type(ssh_contour) speed_cont ! contour with maximum average azimuthal speed - real max_speed ! average of azimuthal speed on speed_cont, in m s-1 + + real max_speed + ! average of azimuthal speed on out_cont or speed_cont, in m s-1 logical valid ! valid out_cont found: not a null contour, and ! with sufficient area diff --git a/successive_overlap.f90 b/successive_overlap.f90 index bd0101e8beeadb867fcb12220cc02e8da4c35d3d..e755c0ab18abc61cd39712ba75f1e8097a53f503 100644 --- a/successive_overlap.f90 +++ b/successive_overlap.f90 @@ -31,7 +31,10 @@ contains ! We look for an overlapping eddy at dist_lim (in grid points) of ! the first extremum. - integer, intent(in):: j, k + integer, intent(in):: j + ! position in time window, between 2 and max_delta + 1 + + integer, intent(in):: k ! date index ! Local: diff --git a/write_eddy.f90 b/write_eddy.f90 index 0d79e0da74f5d4509f658f180d137b8279f34f32..55bad9e9f0733648f93d9f2fa87b65014001aca0 100644 --- a/write_eddy.f90 +++ b/write_eddy.f90 @@ -27,13 +27,13 @@ contains integer, intent(in):: k ! date index integer, intent(in):: i ! eddy index - TYPE(shpfileobject), intent(inout):: hshp_extremum ! shapefile extremum_$m + TYPE(shpfileobject), intent(inout):: hshp_extremum ! shapefile extremum TYPE(shpfileobject), intent(inout):: hshp_outermost - ! shapefile outermost_contour_$m + ! shapefile outermost_contour TYPE(shpfileobject), intent(inout):: hshp_max_speed - ! shapefile x_speed_contour_$m + ! shapefile x_speed_contour ! Local: integer ishape