diff --git a/Common/derived_types.f90 b/Common/derived_types.f90 index 3914603ac4bc914db4a16046bdaec89e75600b73..75b142d25802aa645adf03eb93d58d56197361a2 100644 --- a/Common/derived_types.f90 +++ b/Common/derived_types.f90 @@ -37,8 +37,7 @@ module derived_types ! is not a null ssh contour then max_speed is the speed on ! speed_cont. - logical valid ! valid out_cont found: not a null contour, and - ! with sufficient area + logical valid ! valid out_cont found: not a null contour integer:: delta_in = huge(0) ! Minimum difference in time subscript where there is a direct diff --git a/Inst_eddies/Documentation_texfol/Graphiques/.gitignore b/Inst_eddies/Documentation_texfol/Graphiques/.gitignore index 18408f2cba63d849a4466af472383931cd313f76..f81ca1b4b6b2a57c110e4497a2a7e9afdd41ed27 100644 --- a/Inst_eddies/Documentation_texfol/Graphiques/.gitignore +++ b/Inst_eddies/Documentation_texfol/Graphiques/.gitignore @@ -11,3 +11,4 @@ distribution.pdf user_proc.pdf user_sys.pdf slice.pdf +nearby_extr.pdf diff --git a/Inst_eddies/Documentation_texfol/Graphiques/GNUmakefile b/Inst_eddies/Documentation_texfol/Graphiques/GNUmakefile index d8c50ffd051f28c0e4c5f40c0896fd8a04851b99..0ff27522ba5aadd8230a28a1f06fd865539ac9b7 100644 --- a/Inst_eddies/Documentation_texfol/Graphiques/GNUmakefile +++ b/Inst_eddies/Documentation_texfol/Graphiques/GNUmakefile @@ -1,4 +1,5 @@ -objects = degeneracy.pdf periodicity.pdf copy.pdf set_all_outerm.pdf SHPC.pdf plot_test_output.pdf slice.pdf +objects = degeneracy.pdf periodicity.pdf copy.pdf set_all_outerm.pdf \ +SHPC.pdf plot_test_output.pdf slice.pdf nearby_extr %.pdf: %.odg unoconv --doctype=graphics $< diff --git a/Inst_eddies/Documentation_texfol/Graphiques/nearby_extr.odg b/Inst_eddies/Documentation_texfol/Graphiques/nearby_extr.odg new file mode 100644 index 0000000000000000000000000000000000000000..8c5c50c13ed5815e009f912fcd2ce6dab50a82ec Binary files /dev/null and b/Inst_eddies/Documentation_texfol/Graphiques/nearby_extr.odg differ diff --git a/Inst_eddies/Documentation_texfol/documentation.tex b/Inst_eddies/Documentation_texfol/documentation.tex index 01fca054fbb4335ca54267cae42400d43430d9f7..4d0d003f93b45efdde8b3023b1ae7afb85ed477d 100644 --- a/Inst_eddies/Documentation_texfol/documentation.tex +++ b/Inst_eddies/Documentation_texfol/documentation.tex @@ -281,12 +281,12 @@ shaperead function. \section{Cas pathologiques} -\verb+out_cont+ est vide si et seulement s'il n'y a -pas de bon contour à \verb+innermost_level+, ce qui peut en -particulier se produire si \verb+innermost_level+ correspond à -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. +\verb+out_cont+ est vide s'il n'y a pas de bon contour à +\verb+innermost_level_2+ ou si le contour extérieur trouvé (avec une +amplitude supérieure à l'amplitude minimale par construction) a une +surface insuffisante. L'absence de bon contour à +\verb+innermost_level_2+ peut en particulier se produire si +\verb+innermost_level_2+ correspond à l'amplitude minimale. Le principe général est que la composante \verb+speed_cont+ est vide s'il n'y a pas mieux que \verb+out_cont+ comme contour de vitesse @@ -329,8 +329,7 @@ tableau (\ref{tab:null_ssh_contour}). \verb+out_cont+ & valid & radius4 & \verb+max_speed+ & fraction & note \\ \hline - null & F & 0 & \np{e4} & 5 \% & 1 \\ - $\ne$ null & F & 0 & \np{e4} & 6 \% \\ + null & F & 0 & \np{e4} & 11 \% & 1 \\ $\ne$ null & T & 1 & NaN & 3 \% & 2 \\ $\ne$ null & T & 1 & $\ne \np{e4}$, $\ne$ NaN & 47 \% \\ $\ne$ null & T & $\ge 2$ & $\ne \np{e4}$, $\ne$ NaN & 21 \% @@ -340,14 +339,15 @@ tableau (\ref{tab:null_ssh_contour}). vide]{Cas où la composante speed\_cont d'un tourbillon est 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 + innermost\_level\_2 ou surface du contour extérieur + insuffisante. Note 2 : out\_cont est près d'une côte, champ de 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 -suivants pour les 5 lignes du tableau (\ref{tab:null_ssh_contour}) : -12, 15, 7, 122, 54. Au total : 210 cas où les composantes \verb+out_cont+ ou +suivants pour les 4 lignes du tableau (\ref{tab:null_ssh_contour}) : +27, 7, 122, 54. Au total : 210 cas où les composantes \verb+out_cont+ ou \verb+speed_cont+ d'un tourbillon sont vides, sur 260 tourbillons, soit 81 \% des tourbillons. @@ -632,10 +632,10 @@ l'ordre de parcours du tableau. Il faut prévoir dans \verb+get_1_outerm+ la possibilité de ne pas trouver de bon contour. La logique est impactée. \`A strictement -parler, la valeur de \verb+innermost_level+ ne permet plus de prévoir si +parler, la valeur de \verb+innermost_level_2+ ne permet plus de prévoir si l'amplitude va être suffisante, et on ne sait plus quelle valeur intiale de \verb+level_good+ prendre dans \verb+get_1_outerm+. Je garde -néanmoins \verb+innermost_level+ comme valeur intiale de \verb+level_good+. La +néanmoins \verb+innermost_level_2+ comme valeur intiale de \verb+level_good+. La conséquence est que je risque de ne pas détecter de contour autour d'un extremum dégénéré alors qu'on pourrait peut-être en trouver un en prenant une valeur initiale de \verb+level_good+ plus proche de @@ -918,18 +918,18 @@ direction jusqu'à ce que le sens de variation de SSH change. Dans mes tests, le nombre d'itérations dans la recherche par dichotomie est typiquement une dizaine, pour une précision de \np{0.5} mm. En considérant simplement l'extremum de ssh sur la fenêtre, la taille de -l'intervalle initial [\verb+innermost_level+, level\_try] est plus +l'intervalle initial [\verb+innermost_level_2+, level\_try] est plus grande. Sur mes tests, elle est plus grande typiquement d'un facteur 2 environ seulement, donc le nombre d'itérations change peu. Pour l'amplitude minimale, si je prends simplement l'amplitude -correspondant à \verb+innermost_level+ alors l'algorithme échoue lorsque -l'extremum est à un point du bord et que le point à \verb+innermost_level+ -est au bord. Dans ce cas, good\_contour échoue parce que Contour\_531 -ne ferme pas les contours passant par le bord. J'avais essayé, pour -éviter le problème, de prendre une amplitude minimale légèrement -inférieure mais cela pose des problèmes de cohérence dans -l'algorithme. +correspondant à \verb+innermost_level_2+ alors l'algorithme échoue +lorsque l'extremum est à un point du bord et que le point à +\verb+innermost_level_2+ est au bord. Dans ce cas, good\_contour +échoue parce que Contour\_531 ne ferme pas les contours passant par le +bord. J'avais essayé, pour éviter le problème, de prendre une +amplitude minimale légèrement inférieure mais cela pose des problèmes +de cohérence dans l'algorithme. Remarque. Il est inutile de tester si area est supérieur à \verb+min_area+ à chaque itération. Si area est strictement inférieur, @@ -990,6 +990,25 @@ Cas de périodicité : field(i + m - 2, :) = field(i, :). Il manque des tests pour lesquels direction vaut 1 et 4. +\subsection{nearby\_extr} + +Pour chaque tourbillon du résultat, le contour le plus extérieur doit +être fermé, doit contenir l'extremum $E_1$ de SSH du tourbillon +considéré et ne doit contenir aucun autre extremum de SSH dans une +liste donnée d'extremums. La liste d'extremums qui ne peuvent être +contenus est, dans le cas où $E_1$ est un maximum : les minimums, les +maximums de valeur strictement supérieure à celle de $E_1$, les +maximums de valeur inférieure à celle de $E_1$ avec contour extérieur +d'amplitude et surface significatives. D'un point de vue +algorithmique, cela se traduit par : minimum ou valide, puisqu'on a +initialisé le champ valid à vrai. Cf. figure \ref{fig:nearby_extr}. +\begin{figure}[htbp] + \centering + \includegraphics{nearby_extr} + \caption{nearby\_extr} + \label{fig:nearby_extr} +\end{figure} + \subsection{set\_all\_outerm} \label{sec:set_all_outerm} @@ -999,14 +1018,6 @@ 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. -Pour chaque tourbillon du résultat, le contour le plus extérieur doit -être fermé, doit contenir l'extremum $E_1$ de SSH du tourbillon -considéré et ne doit contenir aucun autre extremum de SSH dans une -liste donnée d'extremums. La liste d'extremums qui ne peuvent être -contenus, est dans le cas où $E_1$ est un maximum : les minimums, les -maximums de valeur supérieure à celle de $E_1$, les maximums valides -(amplitude et surface significatives du contour extérieur). - Cf. algorithme \ref{alg:set_all_outerm}. \begin{algorithm}[htbp] Déclarations : @@ -1026,7 +1037,7 @@ Cf. algorithme \ref{alg:set_all_outerm}. \STATE e\%out\_cont = get\_1\_outerm(e\%cyclone, e\%coord\_extr, innermost\_level, outside\_points, ssh, llc, urc, corner, step) - \STATE e\%valid = e\%out\_cont\%area >= min\_area + \STATE e\%valid = e\%out\_cont\%closed \ENDFOR \end{algorithmic} \caption{subroutine set\_all\_outerm(s, step, ssh, corner)} diff --git a/Inst_eddies/set_all_outerm.f90 b/Inst_eddies/set_all_outerm.f90 index 6f403c6a5ba44f83ac7084e314683af6829e5deb..a6395fc7d55c47328020199fc6babc15ab177b02 100644 --- a/Inst_eddies/set_all_outerm.f90 +++ b/Inst_eddies/set_all_outerm.f90 @@ -20,7 +20,7 @@ contains use nearby_extr_m, only: nearby_extr type(snapshot), intent(inout):: s - ! Define s%list%valid, s%list%out_cont. s%number_extr, + ! Define s%list%valid and s%list%out_cont. s%number_extr, ! s%list%cyclone, s%list%extr, s%list%innermost_level, s%extr_map ! should be defined on entry. @@ -74,7 +74,6 @@ contains if (.not. periodic) nlon = size(ssh, 1) nlat = size(ssh, 2) - allocate(sorted_extr(s%number_extr)) min_area = pi * (min_radius * 1e3)**2