From 8da135e8cfb0587f98033b4a601337d99e9a15fe Mon Sep 17 00:00:00 2001 From: Lionel GUEZ <guez@lmd.ens.fr> Date: Mon, 19 Aug 2019 18:41:30 +0200 Subject: [PATCH] Code `interpolate_eddy` Changing my mind, `interpolate_eddy` only interpolates, it does not write the interpolated eddy, this seems clearer. So it can be a function instead of a subroutine and we call `write_eddy` from overlap. We need to add arguments `hshp_extremum`, `hshp_outermost` and `hshp_max_speed` to overlap. The main program `test_successive_overlap` now has to create shapefiles. --- Documentation_texfol/Graphiques/call_graph.gv | 5 +- .../Graphiques/input_output.odg | Bin 14891 -> 14436 bytes Documentation_texfol/documentation.tex | 154 ++++++++---------- Tests/CMakeLists.txt | 9 +- Tests/test_successive_overlap.f90 | 12 +- interpolate_eddy.f90 | 29 +++- overlap.f90 | 27 ++- 7 files changed, 134 insertions(+), 102 deletions(-) diff --git a/Documentation_texfol/Graphiques/call_graph.gv b/Documentation_texfol/Graphiques/call_graph.gv index 1729d3fa..06a647e9 100644 --- a/Documentation_texfol/Graphiques/call_graph.gv +++ b/Documentation_texfol/Graphiques/call_graph.gv @@ -1,8 +1,7 @@ digraph call_graph { - main -> {get_snapshot successive_overlap non_successive_overlap}; + main -> {get_snapshot overlap}; main -> dispatch_snapshot; - non_successive_overlap -> {interpolate_eddy weight}; + overlap -> {interpolate_eddy weight}; interpolate_eddy -> write_eddy; - successive_overlap -> weight; } \ No newline at end of file diff --git a/Documentation_texfol/Graphiques/input_output.odg b/Documentation_texfol/Graphiques/input_output.odg index cde843e63cfdced69511234f1567462a14a1731d..7a08dfba602812b958e15b1a32b7730743284f18 100644 GIT binary patch delta 12865 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 delta 13405 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 S(9MRMAjg9Sv(5Pr?Ee4*EsWd% diff --git a/Documentation_texfol/documentation.tex b/Documentation_texfol/documentation.tex index af8c26f0..0f1769b7 100644 --- a/Documentation_texfol/documentation.tex +++ b/Documentation_texfol/documentation.tex @@ -997,7 +997,7 @@ Les procédures géométriques utilisées : Ces procédures sont appelées par : \begin{itemize} \item spher\_polyline\_area -\item \verb+successive_overlap+ +\item \verb+overlap+ \end{itemize} Cf. discussion autour de l'équation~(\ref{eq:length_pi}). @@ -1005,7 +1005,12 @@ Cf. discussion autour de l'équation~(\ref{eq:length_pi}). On n'enregistre pas de contours pour les tourbillons interpolés. Les tourbillons interpolés sont écrits avec les autres, en utilisant une -forme NULL pour le polygone correspondant à un contour interpolé. +forme NULL pour le polygone correspondant à un contour interpolé. Un +processus donné, dans plusieurs appels à overlap, peut interpoler des +extremums à une même date. Donc, dans le shapefile \verb+extremum_$m+, +les dates sont dans le désordre. En outre, deux processus peuvent +interpoler des extremums à une même date. Il sera certainement utile +de concaténer et trier les shapefiles en post-traitement. La méta-donnée logique \og interpolé \fg{} dans \verb+extremum_$m.dbf+ est nécessaire parce qu'il est possible de ne @@ -1040,10 +1045,9 @@ suivants : Les entrées-sorties sont dans : l'algorithme principal directement (lecture de longitude et latitude), \verb+get_snapshot+ (lecture des -shapefiles), \verb+successive_overlap+ (écriture dans +shapefiles), \verb+overlap+ (écriture dans \verb+edgelist_$m.txt+, arcs entre \verb+k_begin+(m) et -\verb+k_end_main_loop+(m)), \verb+non_successive_overlap+ directement -(écriture dans \verb+edgelist_$m.txt+), \verb+write_eddy+ (écriture +\verb+k_end_main_loop+(m)), \verb+write_eddy+ (écriture dans \verb+extremum_$m+, \verb+outermost_contour_$m+, \verb+max_speed_contour_$m+), \verb+dispatch_snapshot+ directement (écriture dans \verb+isolated_nodes_$m+, @@ -1065,7 +1069,7 @@ toutes les dates. 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+. +par \verb+overlap+. \begin{description} \item[max\_delta] Scalaire entier. Intervalle maximal d'indices de @@ -1079,7 +1083,7 @@ par \verb+successive_overlap+. 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 +différents appels à overlap avec delta $\ge 2$ : 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 @@ -1107,15 +1111,11 @@ date. Cf. figure (\ref{fig:window}) et algorithme \STATE appel de get\_snapshot(flow(k), k) \ENDFOR - \FOR{k = 2 \TO max\_delta + 1} - - \STATE appel de successive\_overlap(flow, k, k) - \ENDFOR - \FOR{delta = 2 \TO max\_delta} + \FOR{delta = 1 \TO max\_delta} \FOR{k = delta + 1 \TO max\_delta + 1} - \STATE appel de non\_successive\_overlap(k, k, delta, flow) + \STATE appel de overlap(flow, k, k, delta) \ENDFOR \ENDFOR @@ -1129,12 +1129,9 @@ date. Cf. figure (\ref{fig:window}) et algorithme \STATE appel de get\_snapshot(flow(max\_delta + 1), k) - \STATE appel de successive\_overlap(flow, max\_delta + 1, k) - - \FOR{delta = 2 \TO max\_delta} + \FOR{delta = 1 \TO max\_delta} - \STATE appel de non\_successive\_overlap(max\_delta + 1, k, delta, - flow) + \STATE appel de overlap(flow, max\_delta + 1, k, delta) \ENDFOR \ENDFOR @@ -1168,21 +1165,24 @@ Il faut, pour m < \verb+n_proc+ : = \mathtt{k\_begin}(m + 1) + \mathtt{max\_delta} - 1 \end{equation} -k\_end - \verb+k_begin+ + 1 appels à \verb+get_snapshot+, pour les dates \verb+k_begin+ -à k\_end. k\_end - \verb+k_begin+ + 1 appels à \verb+dispatch_snapshot+, pour les -dates \verb+k_begin+ à k\_end. Si m > 1 alors \verb+max_delta+ envois. Si m < -\verb+n_proc+ alors \verb+max_delta+ réceptions. +k\_end - \verb+k_begin+ + 1 appels à \verb+get_snapshot+, pour les +dates \verb+k_begin+ à k\_end. k\_end - \verb+k_begin+ + 1 appels à +\verb+dispatch_snapshot+, pour les dates \verb+k_begin+ à k\_end. Si m +> 1 alors \verb+max_delta+ envois. Si m < \verb+n_proc+ alors +\verb+max_delta+ réceptions. -Nombre d'appels à \verb+get_snapshot+ avec lecture. Si m < \verb+n_proc+ : k\_end - -\verb+k_begin+ - \verb+max_delta+ + 1. Si m = \verb+n_proc+ : k\_end - \verb+k_begin+ + 1. +Nombre d'appels à \verb+get_snapshot+ avec lecture. Si m < +\verb+n_proc+ : k\_end - \verb+k_begin+ - \verb+max_delta+ + 1. Si m = +\verb+n_proc+ : k\_end - \verb+k_begin+ + 1. -\verb+successive_overlap+ est appelé pour tous les indices k compris entre -\verb+k_begin+ + 1 et \verb+k_end_main_loop+, seulement. Nombre d'appels à -\verb+successive_overlap+ : \verb+k_end_main_loop+ - \verb+k_begin+. Donc si m < -\verb+n_proc+ : k\_end - \verb+k_begin+ - \verb+max_delta+ + 1 appels. Si m = \verb+n_proc+ : k\_end -- \verb+k_begin+ appels. +overlap avec delta = 1 est appelé pour tous les indices k compris +entre \verb+k_begin+ + 1 et \verb+k_end_main_loop+, seulement. Nombre +d'appels à overlap avec delta = 1 : \verb+k_end_main_loop+ - +\verb+k_begin+. Donc si m < \verb+n_proc+ : k\_end - \verb+k_begin+ - +\verb+max_delta+ + 1 appels. Si m = \verb+n_proc+ : k\_end - +\verb+k_begin+ appels. -Nombre d'appels à \verb+non_successive_overlap+ dans le prologue : +Nombre d'appels à overlap avec delta $\ge 2$ dans le prologue : \begin{equation*} \sum_{\delta = 2} ^{\mathtt{max\_delta}} (\mathtt{max\_delta} - \delta +1) @@ -1324,7 +1324,7 @@ un seul processus. \subsection{Algorithme principal, parallèle} -\begin{algorithmic}[1] +\begin{algorithmic} \STATE \COMMENT{\{max\_delta $\ge 1$; n\_dates $\ge$ max\_delta + 1; n\_proc $\le E\left(\frac{\mathtt{n\_dates}}{\mathtt{max\_delta} + 1} @@ -1365,16 +1365,11 @@ un seul processus. \COMMENT{lecture} \ENDFOR - \FOR{k = k\_begin + 1 \TO k\_begin + max\_delta} - - \STATE appel de successive\_overlap(flow, k - k\_begin + 1, k) - \ENDFOR - \FOR{delta = 2 \TO max\_delta} + \FOR{delta = 1 \TO max\_delta} \FOR{k = k\_begin + delta \TO k\_begin + max\_delta} - \STATE appel de non\_successive\_overlap(k - k\_begin + 1, k, delta, - flow) + \STATE appel de overlap(flow, k - k\_begin + 1, k, delta) \ENDFOR \ENDFOR @@ -1389,12 +1384,9 @@ un seul processus. \STATE appel de get\_snapshot(flow(max\_delta + 1), k) - \STATE appel de successive\_overlap(flow, max\_delta + 1, k) - - \FOR{delta = 2 \TO max\_delta} + \FOR{delta = 1 \TO max\_delta} - \STATE appel de non\_successive\_overlap(max\_delta + 1, k, delta, - flow) + \STATE appel de overlap(flow, max\_delta + 1, k, delta) \ENDFOR \ENDFOR @@ -1412,8 +1404,7 @@ un seul processus. \FOR{delta = k - k\_end + max\_delta \TO max\_delta} - \STATE appel de non\_successive\_overlap(max\_delta + 1, k, delta, - flow) + \STATE appel de overlap(max\_delta + 1, k, delta, flow) \ENDFOR \ENDFOR @@ -1450,7 +1441,37 @@ champ interpolated pour distinguer les tourbillons interpolés de ceux pour lesquels un extremum a été détecté mais sans obtenir de contour extérieur. -\subsubsection{non\_successive\_overlap} +\subsubsection{overlap} + +Accélération possible en ne comparant à i1 que les trois tourbillons +les plus proches (distance entre les extremums), comme dans la +fonction \verb+Eddy_Intersection+ du programme pour Matlab. + +On ne peut éviter la copie de polylines due à l'alternative contour +extérieur -- contour de vitesse maximale. Pour ne pas faire la copie +dans polygon\_1 et polygon\_2, il faudrait faire des copies de +\verb+out_cont+ dans \verb+speed_cont+ dans \verb+get_snapshot+, on ne +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. j, k, delta $\in \{2, \dots, \mathtt{max\_delta}\}$ : scalaires entiers, données. flow : donnée-résultat. Cherche les arcs entre @@ -1459,11 +1480,9 @@ k. Écrit ces arcs dans \verb+graph.txt+, écrit les tourbillons interpolés dans les shapefiles via interpolate\_eddy et \verb+write_eddy+. Met à jour flow(j - delta)\%list\_vis\%delta\_out, flow(j)\%list\_vis\%delta\_in, flow\%number\_eddies. Cf. algorithme -(\ref{alg:non_successive_overlapping}). +(\ref{alg:overlapping}). \begin{algorithm}[htbp] \begin{algorithmic} - \STATE \COMMENT{recouvrements à dates non successives} - \FOR{i1 = 1 \TO flow(j - delta)\%number\_vis\_extr} \IF{flow(j - delta)\%list\_vis(i1)\%valid} @@ -1528,43 +1547,10 @@ flow(j)\%list\_vis\%delta\_in, flow\%number\_eddies. Cf. algorithme \ENDIF \ENDFOR \end{algorithmic} - \caption{Sous-algorithme non\_successive\_overlap(j, k, delta, - flow)} - \label{alg:non_successive_overlapping} + \caption{Sous-algorithme overlap(flow, j, k, delta)} + \label{alg:overlapping} \end{algorithm} -\subsubsection{successive\_overlap} - -Accélération possible en ne comparant à i1 que les trois tourbillons -les plus proches (distance entre les extremums), comme dans la -fonction \verb+Eddy_Intersection+ du programme pour Matlab. - -On ne peut éviter la copie de polylines due à l'alternative contour -extérieur -- contour de vitesse maximale. Pour ne pas faire la copie -dans polygon\_1 et polygon\_2, il faudrait faire des copies de -\verb+out_cont+ dans \verb+speed_cont+ dans \verb+get_snapshot+, on ne -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 diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index d51232cd..36604514 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -29,10 +29,11 @@ target_link_libraries(test_nearby_extr ${contour_531_LIBRARY} # test_successive_overlap -add_executable(test_successive_overlap derived_types.f90 - overlap.f90 read_snapshot.f90 spher_polygon_area.f90 - spher_polyline_area.f90 weight.f90 read_eddy.f90 - read_field_indices.f90 candidate_overlap.f90 interpolate_eddy.f90 +add_executable(test_successive_overlap derived_types.f90 overlap.f90 + read_snapshot.f90 spher_polygon_area.f90 spher_polyline_area.f90 + weight.f90 read_eddy.f90 read_field_indices.f90 + candidate_overlap.f90 interpolate_eddy.f90 write_eddy.f90 + init_shapefiles.f90 ${CMAKE_CURRENT_LIST_DIR}/test_successive_overlap.f90) target_include_directories(test_successive_overlap PRIVATE diff --git a/Tests/test_successive_overlap.f90 b/Tests/test_successive_overlap.f90 index a5e4cc6e..87a89323 100644 --- a/Tests/test_successive_overlap.f90 +++ b/Tests/test_successive_overlap.f90 @@ -9,6 +9,7 @@ program test_successive_overlap use shapelib_03, only: shp_open_03 use derived_types, only: snapshot + use init_shapefiles_m, only: init_shapefiles use read_field_indices_m, only: read_field_indices use read_snapshot_m, only: read_snapshot use overlap_m, only: overlap @@ -98,10 +99,17 @@ program test_successive_overlap // '"successor eddy subscript"' write(unit_edgelist, fmt = *) "k1 i1 k2 i2 weight" - call overlap(flow, unit_edgelist, nlon, nlat, periodic, dist_lim, j = 2, & - k = k, delta = 1) + call init_shapefiles(hshp_extremum, hshp_outermost, hshp_max_speed) + call overlap(flow, unit_edgelist, nlon, nlat, periodic, dist_lim, & + hshp_extremum, hshp_outermost, hshp_max_speed, j = 2, k = k, delta = 1) close(unit_edgelist) print *, 'Created file "edgelist.csv".' + CALL shpclose(hshp_extremum) + print *, 'Created shapefile "Snapshot/extremum".' + CALL shpclose(hshp_outermost) + print *, 'Created shapefile "Snapshot/outermost_contour".' + CALL shpclose(hshp_max_speed) + print *, 'Created shapefile "Snapshot/max_speed_contour".' print *, snapshot_1, ":" print *, "Valid isolated eddies:" diff --git a/interpolate_eddy.f90 b/interpolate_eddy.f90 index c224af41..da25b410 100644 --- a/interpolate_eddy.f90 +++ b/interpolate_eddy.f90 @@ -4,8 +4,33 @@ module interpolate_eddy_m contains - subroutine interpolate_eddy + pure function interpolate_eddy(e1, e2, k1, k2, k) - end subroutine interpolate_eddy + ! Defines a linearly interpolated eddy. Interpolation of extrema + ! only, not of contours. + + use derived_types, only: eddy, null_ssh_contour, missing_speed + + type(eddy) interpolate_eddy + type(eddy), intent(in):: e1, e2 ! between which we want to interpolate + integer, intent(in):: k1, k2 ! date indices of e1 and e2 + integer, intent(in):: k ! date index at which we want to interpolate + + ! Local: + real w + + !--------------------------------------------------------------------- + + w = (k - k1) / real(k2 - k1) + + interpolate_eddy = eddy( & + coord_extr = (1 - w) * e1%coord_extr + w * e2%coord_extr, & + ssh_extr = (1 - w) * e1%ssh_extr + w * e2%ssh_extr, & + cyclone = e1%cyclone, out_cont = null_ssh_contour(), & + speed_cont = null_ssh_contour(), max_speed = missing_speed, & + valid = .false., interpolated = .true., radius4 = 0) + ! e1%cyclone should be the same as e2%cyclone + + end function interpolate_eddy end module interpolate_eddy_m diff --git a/overlap.f90 b/overlap.f90 index 278a182d..a552007b 100644 --- a/overlap.f90 +++ b/overlap.f90 @@ -4,8 +4,8 @@ module overlap_m contains - subroutine overlap(flow, unit_edgelist, nlon, nlat, periodic, & - dist_lim, j, k, delta) + subroutine overlap(flow, unit_edgelist, nlon, nlat, periodic, dist_lim, & + hshp_extremum, hshp_outermost, hshp_max_speed, j, k, delta) ! Finds edges between flow(j - delta) and flow(j), corresponding to ! dates k - delta and k. Writes these edges to unit_edgelist. Updates @@ -19,9 +19,11 @@ contains use candidate_overlap_m, only: candidate_overlap use derived_types, only: snapshot use interpolate_eddy_m, only: interpolate_eddy + use shapelib, only: shpfileobject use spher_polygon_area_m, only: spher_polygon_area use spher_polyline_area_m, only: spher_polyline_area use weight_m, only: weight + use write_eddy_m, only: write_eddy type(snapshot), intent(inout):: flow(:) ! (max_delta + 1) integer, intent(in):: unit_edgelist ! logical unit for edgelist file @@ -32,6 +34,13 @@ contains ! We look for an overlapping eddy at dist_lim (in grid points) of ! the first extremum. + TYPE(shpfileobject), intent(in):: hshp_extremum ! shapefile extremum + + TYPE(shpfileobject), intent(in):: hshp_outermost + ! shapefile outermost_contour + + TYPE(shpfileobject), intent(in):: hshp_max_speed ! shapefile x_speed_contour + integer, intent(in):: j ! position in time window, between 2 and max_delta + 1 @@ -40,7 +49,7 @@ contains ! Local: - integer i1, i2, l, n_select, m, i_pred, j_interp + integer i1, i2, l, n_select, m, i_pred, j_interp, k_interp type(polyline) polyline_1, polyline_2 type(polygon) res_pol real w @@ -110,10 +119,14 @@ contains flow(j_interp)%number_eddies & = flow(j_interp)%number_eddies + 1 - call interpolate_eddy - write(unit_edgelist, fmt = *) k - j + j_interp - 1, & - i_pred, k - j + j_interp, & - flow(j_interp)%number_eddies, w + k_interp = k - j + j_interp + call write_eddy(interpolate_eddy( & + flow(j - delta)%list_vis(i1), flow(j)%list_vis(i2), & + k - delta, k, k_interp), k_interp, & + flow(j_interp)%number_eddies, hshp_extremum, & + hshp_outermost, hshp_max_speed) + write(unit_edgelist, fmt = *) k_interp - 1, i_pred, & + k_interp, flow(j_interp)%number_eddies, w i_pred = flow(j_interp)%number_eddies end do -- GitLab