From 2b036a1e6f4e6f0b6cd7da5091687a34a3c5bf0a Mon Sep 17 00:00:00 2001 From: Lionel GUEZ <guez@lmd.ens.fr> Date: Wed, 16 Mar 2022 14:05:18 +0100 Subject: [PATCH] Polish --- CMakeLists.txt | 1 + Inst_eddies/Analysis/filter.py | 4 +- Inst_eddies/CMakeLists.txt | 5 ++ .../Graphiques/elapsed_time.py | 20 +++++ .../Graphiques/perf_report_inst_eddies.csv | 60 +++++++++++++++ .../perf_report_inst_eddies_0_17.csv | 60 +++++++++++++++ .../Documentation_texfol/documentation.tex | 76 ++++++++++++++----- Inst_eddies/Tests/Input/accept.py | 4 +- Inst_eddies/inst_eddies.py.in | 7 +- .../Documentation_texfol/documentation.tex | 5 +- 10 files changed, 219 insertions(+), 23 deletions(-) create mode 100644 Inst_eddies/Documentation_texfol/Graphiques/elapsed_time.py create mode 100644 Inst_eddies/Documentation_texfol/Graphiques/perf_report_inst_eddies.csv create mode 100644 Inst_eddies/Documentation_texfol/Graphiques/perf_report_inst_eddies_0_17.csv diff --git a/CMakeLists.txt b/CMakeLists.txt index 329554d4..e13498fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,7 @@ if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) endif() if(NOT TARGET fortranGIS) + # Some test programs use fortrangis and do not use Shapelib_03: find_package(fortrangis REQUIRED CONFIG) endif() diff --git a/Inst_eddies/Analysis/filter.py b/Inst_eddies/Analysis/filter.py index 6f9de4dd..4c321783 100755 --- a/Inst_eddies/Analysis/filter.py +++ b/Inst_eddies/Analysis/filter.py @@ -1,6 +1,8 @@ #!/usr/bin/env python3 -"""Note: "ishape_last.txt" is only created with option renumber. +"""Note: "ishape_last.txt" is only created with option +renumber. Module accept must be provided. There is an example in +Inst_eddies/Tests/Input. """ diff --git a/Inst_eddies/CMakeLists.txt b/Inst_eddies/CMakeLists.txt index c0e53c29..e01c9920 100644 --- a/Inst_eddies/CMakeLists.txt +++ b/Inst_eddies/CMakeLists.txt @@ -1,3 +1,4 @@ +# inst_eddies: add_executable(inst_eddies inst_eddies.f90 local_extrema.f90 set_max_speed.f90 get_1_outerm.f90 max_speed_contour_ssh.f90 good_contour.f90 mean_speed.f90 inside_4.f90 set_all_outerm.f90 nearby_extr.f90 get_var.f90 write_aux.f90 @@ -5,12 +6,16 @@ add_executable(inst_eddies inst_eddies.f90 local_extrema.f90 set_max_speed.f90 target_link_libraries(inst_eddies PRIVATE Contour_531::contour_531 Geometry::geometry NetCDF95::netcdf95 Shapelib_03::shapelib_03 Numer_Rec_95::numer_rec_95 Jumble::jumble NetCDF_Fortran::netcdff) + +# Python scripts: configure_file(inst_eddies.py.in inst_eddies.py @ONLY FILE_PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) file(COPY inst_eddies_Aviso.py DESTINATION . FILE_PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) + +# Tests: add_subdirectory(Tests) target_sources(test_get_1_outerm PRIVATE get_1_outerm.f90 good_contour.f90) target_sources(test_set_all_outerm PRIVATE set_all_outerm.f90 diff --git a/Inst_eddies/Documentation_texfol/Graphiques/elapsed_time.py b/Inst_eddies/Documentation_texfol/Graphiques/elapsed_time.py new file mode 100644 index 00000000..93b9aeec --- /dev/null +++ b/Inst_eddies/Documentation_texfol/Graphiques/elapsed_time.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 + +import pandas as pd +import matplotlib.pyplot as plt + +perf = pd.read_csv("perf_report_inst_eddies.csv", index_col=0) +perf_0_17 = pd.read_csv("perf_report_inst_eddies_0_17.csv", index_col=0) +fig, ax = plt.subplots(figsize=(8.15, 4.8)) +fig.subplots_adjust(top=0.97, left=0.095, right=0.69) +perf.plot(ax = ax, legend = None) +ax.plot(perf_0_17["elapsed Fortran"], label = "elapsed Fortran 0.17") +ax.plot(perf_0_17["elapsed cat"], label = "elapsed cat") +ax.plot(perf_0_17["elapsed NCO"], label = "elapsed NCO 0.17") +ax.plot(perf_0_17["elapsed Fortran"] + perf_0_17["elapsed cat"], + label = "elapsed Fortran 0.17 + cat") +ax.set_ylabel("time (s)") +fig.autofmt_xdate() +fig.legend(loc = "right") +plt.savefig("elapsed_time.pdf") +##plt.show() diff --git a/Inst_eddies/Documentation_texfol/Graphiques/perf_report_inst_eddies.csv b/Inst_eddies/Documentation_texfol/Graphiques/perf_report_inst_eddies.csv new file mode 100644 index 00000000..6b849dde --- /dev/null +++ b/Inst_eddies/Documentation_texfol/Graphiques/perf_report_inst_eddies.csv @@ -0,0 +1,60 @@ +date,elapsed NCO,elapsed Fortran +1993-01-01,3.2893714700476266,69.55748717399547 +1993-01-02,7.849872671999037,84.92520007799612 +1993-01-03,7.031129262992181,93.11914208205417 +1993-01-04,6.6251473859883845,92.33684102998814 +1993-01-05,8.872666517039761,99.99801624496467 +1993-01-06,7.04201443499187,99.78693078801734 +1993-01-07,8.352719530987088,107.4334867799771 +1993-01-08,5.957446595013607,121.24453041999368 +1993-01-09,6.811668341979384,108.44273754197638 +1993-01-10,6.876321975025348,109.13818129297579 +1993-01-11,8.41271882498404,108.24826581095112 +1993-01-12,7.516053581028245,114.73520872101653 +1993-01-13,6.538074520009104,125.8919549669954 +1993-01-14,7.495979505998548,126.50189751700964 +1993-01-15,8.413056864985265,156.7574282269925 +1993-01-16,7.359477036981843,159.75526666396763 +1993-01-17,9.229673043999355,145.1923110279604 +1993-01-18,7.583611456037033,154.6173025869648 +1993-01-19,7.304278919007629,156.89128828700632 +1993-01-20,5.843465435085818,165.57676382991485 +1993-01-21,7.3137205900857225,165.62924052099697 +1993-01-22,6.275111605064012,159.0545307949651 +1993-01-23,7.446048315032385,144.9971734220162 +1993-01-24,6.715303701930679,135.32838135992642 +1993-01-25,7.665257273009047,118.24432891304605 +1993-01-26,7.382987734978087,114.37454084807541 +1993-01-27,8.191224109963514,121.22434577008244 +1993-01-28,7.5507736740401015,123.3405563510023 +1993-01-29,7.2626618419308215,123.39857474295422 +1993-01-30,7.191848551039584,116.14068330801092 +1993-01-31,6.7195616740500554,118.19204083399381 +1993-02-01,6.67564572498668,120.86584229802247 +1993-02-02,8.501024959026836,119.8340836049756 +1993-02-03,7.311727856984362,125.06200841697864 +1993-02-04,8.49490319204051,124.26725488796365 +1993-02-05,8.097106094006449,136.24348538101185 +1993-02-06,7.827034011948854,140.77861595596187 +1993-02-07,7.037812053924426,133.9225886448985 +1993-02-08,7.300804301979952,134.50840888300445 +1993-02-09,8.23091415700037,146.5331069349777 +1993-02-10,8.273123448016122,141.58113374595996 +1993-02-11,7.196780981030315,168.8217340420233 +1993-02-12,5.4656356669729576,146.65078854898456 +1993-02-13,7.865352036897093,148.41570352006238 +1993-02-14,8.710694030974992,139.21072487800848 +1993-02-15,7.181609441991895,140.87127993803006 +1993-02-16,7.317532932967879,126.39484425995033 +1993-02-17,7.592014836031012,129.99460101907607 +1993-02-18,6.8357603549957275,122.60817730601411 +1993-02-19,7.318399091949686,122.00685867504217 +1993-02-20,7.531206678017043,109.44884346495382 +1993-02-21,7.126260661985725,119.0290589730721 +1993-02-22,7.535190106020309,125.17490786302369 +1993-02-23,7.929216188029386,124.63406615098938 +1993-02-24,8.533985601039603,139.82530068198685 +1993-02-25,10.729103101999499,125.65844885399565 +1993-02-26,7.237651216913946,127.74466966604814 +1993-02-27,8.173235115944408,124.43069692398421 +1993-02-28,7.084290536935441,122.04703794501256 diff --git a/Inst_eddies/Documentation_texfol/Graphiques/perf_report_inst_eddies_0_17.csv b/Inst_eddies/Documentation_texfol/Graphiques/perf_report_inst_eddies_0_17.csv new file mode 100644 index 00000000..ada4c45e --- /dev/null +++ b/Inst_eddies/Documentation_texfol/Graphiques/perf_report_inst_eddies_0_17.csv @@ -0,0 +1,60 @@ +date,elapsed NCO,elapsed Fortran,elapsed cat +1993-01-01,3.0901350359781645,71.7504221930285,0.004124971979763359 +1993-01-02,3.200717727013398,85.51937657099916,13.84133860701695 +1993-01-03,6.453957258956507,84.87060597504023,17.505336997972336 +1993-01-04,5.759323227975983,66.35113128897501,14.281902063987218 +1993-01-05,2.761238229984883,63.50601018802263,33.52057790500112 +1993-01-06,4.201626594993286,69.07475118699949,23.051912277995143 +1993-01-07,3.3345236200257204,62.20255009602988,63.206579864025116 +1993-01-08,4.836528006999288,72.57609493704513,63.71964116097661 +1993-01-09,3.6164878209820017,65.00932684500003,30.152657398954034 +1993-01-10,5.042031451012008,74.20013268804178,41.344360115006566 +1993-01-11,2.5706540339742787,66.23193804704351,48.442931215977296 +1993-01-12,4.285904535034206,63.33210120705189,64.10520510899369 +1993-01-13,4.3242473709979095,66.37076439900557,63.08483844995499 +1993-01-14,7.975706119963434,73.12388161802664,49.8682603299967 +1993-01-15,4.20400804001838,77.14539974904619,56.30603249295382 +1993-01-16,4.352678089984693,66.206111943,119.58327071001986 +1993-01-17,8.713196224009153,72.66597551800078,72.52913882199209 +1993-01-18,4.430759193957783,75.57036633300595,113.08621953701368 +1993-01-19,3.9799340069876052,73.10977527400246,88.96055018802872 +1993-01-20,8.12350206397241,70.53396456298651,92.95222207799088 +1993-01-21,4.14605187100824,74.0520255129668,125.38167527801124 +1993-01-22,3.152127114997711,73.77176170505118,123.90884489897871 +1993-01-23,10.263262305990793,75.5307018100284,97.68436216498958 +1993-01-24,6.23972294194391,69.61514874099521,76.52981025201734 +1993-01-25,6.4711440480314195,71.61905278096674,64.05774771800498 +1993-01-26,7.763230887998361,73.27510224300204,56.18276482197689 +1993-01-27,7.9135023189592175,78.61758837499656,58.442595792002976 +1993-01-28,8.142888989998028,76.51393708301475,55.364466429979075 +1993-01-29,8.254636748984922,75.21549922501436,51.701735898968764 +1993-01-30,3.8482023859978653,70.74772785697132,34.40200518298661 +1993-01-31,2.5146679900353774,71.63438882899936,40.885456254996825 +1993-02-01,4.5364538640133105,70.1177538530319,45.76120470097521 +1993-02-02,5.220355848025065,72.75402677396778,50.5067452689982 +1993-02-03,2.8045955119887367,73.36987422296079,58.34516322298441 +1993-02-04,5.222081124025863,75.33309303800343,59.523019879998174 +1993-02-05,5.951969084038865,78.5956856799894,71.2456582300365 +1993-02-06,5.029702848987654,80.0938917369931,81.84646402695216 +1993-02-07,3.945086480001919,79.06037547101732,74.13899596099509 +1993-02-08,5.829878080985509,71.08888992096763,85.22875768598169 +1993-02-09,3.211551951011643,72.32345453801099,100.8228057710221 +1993-02-10,2.70511413004715,81.42412036901806,117.07514837500639 +1993-02-11,4.925564266974106,76.85867370897904,93.91957081999863 +1993-02-12,3.5261427619843744,75.26098189497134,102.53938236401882 +1993-02-13,4.435621167998761,72.34669983596541,87.87498543504626 +1993-02-14,2.901580923004076,71.69582331104903,105.5421871279832 +1993-02-15,3.008389235008508,74.18369196401909,91.34581281000283 +1993-02-16,4.267589656985365,69.21201356104575,71.48417646897724 +1993-02-17,3.633157239004504,69.05067607900128,64.40987796505215 +1993-02-18,4.703310971963219,72.05070941499434,46.006244396965485 +1993-02-19,2.6703485359903425,72.04068542202003,44.00213264703052 +1993-02-20,3.0005346529651433,70.66123105498264,39.750067585962825 +1993-02-21,5.09926314902259,72.30556776799494,59.33556727098767 +1993-02-22,3.6469921689713374,71.66501602903008,71.15747504704632 +1993-02-23,4.287503774976358,72.75226642697817,69.09744390897686 +1993-02-24,2.3635044320253655,69.30265067802975,74.17908748594346 +1993-02-25,4.216207752004266,72.10527823999291,71.09481163701275 +1993-02-26,3.4488210909767076,69.87986868503504,65.51352055801544 +1993-02-27,6.490923753008246,69.92170295701362,58.173927237978205 +1993-02-28,4.145223431987688,69.90177033701912,68.55330124404281 diff --git a/Inst_eddies/Documentation_texfol/documentation.tex b/Inst_eddies/Documentation_texfol/documentation.tex index 7c38a40b..93fe8c2b 100644 --- a/Inst_eddies/Documentation_texfol/documentation.tex +++ b/Inst_eddies/Documentation_texfol/documentation.tex @@ -704,7 +704,7 @@ vitesse maximale), 720 latitudes par 1440 longitudes. un scalaire de ce type : \begin{equation*} \mathrm{taille}(\mathtt{eddy}) - = 11\ \mathrm{mots} + \mathrm{taille}(\mathtt{out\_cont}) + = 9\ \mathrm{mots} + \mathrm{taille}(\mathtt{out\_cont}) + \mathrm{taille}(\mathtt{speed\_cont}) \end{equation*} Notons $n_o$ le nombre de points dans le contour extérieur @@ -712,8 +712,8 @@ vitesse maximale), 720 latitudes par 1440 longitudes. de vitesse maximale (speed\_cont\%n\_points). On obtient : \begin{align*} \mathrm{taille}(\mathtt{eddy}) - & = [2 (n_o + n_s) + 19]\ \mathrm{mots} \\ - & = 4 [2 (n_o + n_s) + 19]\ \mathrm{B} + & = [2 (n_o + n_s) + 17]\ \mathrm{mots} \\ + & = 4 [2 (n_o + n_s) + 17]\ \mathrm{B} \end{align*} soit environ \np{0.5} KiB. \item[snapshot\%list\_vis] On a besoin d'encapsuler le vecteur de type @@ -723,7 +723,7 @@ soit environ \np{0.5} KiB. \begin{equation*} n_{ve} \langle \mathrm{taille}(\mathtt{eddy}) \rangle = n_{ve} - [2 (\langle n_o \rangle + \langle n_s \rangle) + 19]\ \mathrm{mots} + [2 (\langle n_o \rangle + \langle n_s \rangle) + 17]\ \mathrm{mots} \end{equation*} soit environ 4 MiB. \item[snapshot\%extr\_map] Notons $n_\lambda$ le nombre de longitudes, @@ -737,7 +737,7 @@ On a : \mathrm{taille}(\mathtt{snapshot}) & = n_{ve} \langle \mathrm{taille}(\mathtt{eddy}) \rangle + (n_\lambda n_\phi + 2 n_{ve} + 2)\ \mathrm{mots} \\ - & = [n_{ve} (2 (\langle n_o \rangle + \langle n_s \rangle) + 21) + & = [n_{ve} (2 (\langle n_o \rangle + \langle n_s \rangle) + 19) + n_\lambda n_\phi + 2]\ \mathrm{mots} \end{align*} D'où la taille d'un scalaire de type snapshot : environ 8 MiB. @@ -1242,36 +1242,74 @@ l'exécutable Fortran. Cf. figure \ref{fig:elapsed_time}. \begin{figure}[htbp] \centering \includegraphics[width=\textwidth]{elapsed_time} - \caption[Temps écoulé]{Test de performance, temps écoulé par date - traitée. Version 0.17 sur Ciclad, ifort 19, release build.} + \caption[Temps écoulé]{Test de performance de + \texttt{inst\_eddies.py}, temps écoulé par date traitée. Versions + 0.17 et ba6ab118 sur Ciclad, ifort 19, release build. Domaine + global, 59 dates (janvier et février).} \label{fig:elapsed_time} \end{figure} +Avec la version ba6ab118, bizarrement on ne gagne presque rien. En +outre, bizarrement aussi, il semble y avoir un cycle reproductible de +temps d'exécution par date. \section{Améliorations, prolongements} +Idée de chercher les contours extérieurs dans un rayon de 10 points +d'abord et d'agmenter éventuellement le rayon jusqu'à max\_radius si +le contour extérieur trouvé est à un point du bord du domaine. + +Créer une carte de présence. \`A chaque point du maillage, enregistrer +le numéro du tourbillon présent ou 0. Méthode : pour chaque contour +extérieur (ou chaque contour de maximum de vitesse ?), pour chaque +point dans le rectangle circonscrit et dans le bon intervalle de SSH, +appeler \verb+polygon_contains_point+. Ou chercher les points connexes +à l'extremum et dans le bon intervalle de SSH ? + +\subsection{Grille non longitude-latitude} + Comment faire si la grille n'est pas une grille longitude-latitude ? La position en longitude et latitude intervient essentiellement à travers les variables corner, step et \verb+min_area+. Idée de faire tout le traitement dans l'espace des indices mais la latitude et la longitude interviennent dans le calcul de la surface des contours (appel à \verb+spher_polyline_area+ dans \verb+get_1_outerm+) et dans -le calcul de la vitesse moyenne (procédure \verb+mean_speed+). Donc -plutôt créer une procédure \verb+find_contours_curv+ dans -\verb+Contour_531+. Dans \verb+find_contours_curv+, il faut faire une +le calcul de la vitesse moyenne (procédure \verb+mean_speed+). + +Donc plutôt créer une procédure \verb+find_contours_curv+ dans +\verb+Contour_531+ ? Dans \verb+find_contours_curv+, il faut faire une interpolation bilinéaire de $\lambda$ et $\phi$ aux points d'un contour. Comme les points d'un contour sont par construction sur les arêtes du maillage, l'interpolation est en fait linéaire à une seule dimension. -Idée de chercher les contours extérieurs dans un rayon de 10 points -d'abord et d'agmenter éventuellement le rayon jusqu'à max\_radius si -le contour extérieur trouvé est à un point du bord du domaine. +Le passage $(i, j) \in \mathbb{N}^2 \to (\lambda, \phi)$ est ok : +c'est juste un accès direct aux tableaux venant du fichier NetCDF. Le +passage $(i, j) \in \mathbb{R}^2 \to (\lambda, \phi)$ est ok aussi : +c'est une interpolation bilinéaire. Le problème est le passage +$(\lambda, \phi) \to (i, j) \in \mathbb{R}^2$. -Créer une carte de présence. \`A chaque point du maillage, enregistrer -le numéro du tourbillon présent ou 0. Méthode : pour chaque contour -extérieur (ou chaque contour de maximum de vitesse ?), pour chaque -point dans le rectangle circonscrit et dans le bon intervalle de SSH, -appeler \verb+polygon_contains_point+. Ou chercher les points connexes -à l'extremum et dans le bon intervalle de SSH ? +Idée : faire passer \verb+snapshot%ind_extr+ dans eddy et l'écrire +dans le shapefile extr dbf (pour \verb+eddy_graph+). Ajouter dans eddy +une composante polyline \verb+out_cont_no_coord+. Dans \verb+set_max_speed+, +calculer \verb+mean_speed+ sur (radius4 - 1) $\times$ 4 contours. Mettre +\verb+outside_points vide+ dans \verb+good_contour+. Faire la recherche avec +\verb+good_contour+ dans l'espace des indices. + +\begin{algorithmic} + \STATE lire ($\lambda$, $\phi$, u, v, ssh, angle) + \STATE définition de extr map, ind extr, innermost level, cyclone + \FORALL{extremum} + \STATE calculer coord extr (pas d'interpolation) + \ENDFOR + \FORALL{extremum} + \STATE définir outside points dans l'espace des indices + \STATE get 1 outerm + \ENDFOR +\end{algorithmic} + +\verb+get_1_outerm+ : dans l'espace des indices et dans l'espace +$(\lambda, \phi)$. \verb+mean_speed+ : faire l'interpolation dans +l'espace des indices et faire une rotation de la vitesse. Il faut le +contour extérieur dans l'espace des indices. \end{document} diff --git a/Inst_eddies/Tests/Input/accept.py b/Inst_eddies/Tests/Input/accept.py index d40ede31..72fdc205 100644 --- a/Inst_eddies/Tests/Input/accept.py +++ b/Inst_eddies/Tests/Input/accept.py @@ -1,5 +1,7 @@ def accept(shape_rec_extr, shape_rec_outer, shape_rec_max): - """Filtering function.""" + """Filtering function. Arguments are ShapeRecord objects from pyshp. + + """ ##return 0.125 <= shape_rec_extr.shape.points[0][0] <= 29.875 \ ## and -59.875 <= shape_rec_extr.shape.points[0][1] <= -15.125 diff --git a/Inst_eddies/inst_eddies.py.in b/Inst_eddies/inst_eddies.py.in index 30b65aa4..76c9c6ae 100644 --- a/Inst_eddies/inst_eddies.py.in +++ b/Inst_eddies/inst_eddies.py.in @@ -15,6 +15,11 @@ import time import csv def loop_inst_eddies(files, bbox, d): + """files is a sequence of file paths. bbox is a tuple of four real + numbers. d is a date index (integer value) for the first date. + + """ + inst_eddies_exe = "@CMAKE_CURRENT_BINARY_DIR@/inst_eddies" if not os.access(inst_eddies_exe, os.X_OK): @@ -31,7 +36,7 @@ def loop_inst_eddies(files, bbox, d): if os.access(f"SHPC_{orient}", os.F_OK): shutil.rmtree(f"SHPC_{orient}") os.mkdir(f"SHPC_{orient}") - perf_report = open("perf_report.csv", "w", newline='') + perf_report = open("perf_report.csv", "w", newline = '') writer = csv.writer(perf_report, lineterminator = "\n") writer.writerow(["date", "elapsed NCO", "elapsed Fortran"]) diff --git a/Overlap/Documentation_texfol/documentation.tex b/Overlap/Documentation_texfol/documentation.tex index a629da2c..8559304a 100644 --- a/Overlap/Documentation_texfol/documentation.tex +++ b/Overlap/Documentation_texfol/documentation.tex @@ -840,7 +840,10 @@ nombre de tourbillons visibles. L'intérêt serait de pouvoir traiter des domaines extraits d'un snapshot global. il faudrait ajouter une composante identifiant au type eddy. -Optimisation. Penser à \verb+MPI_send_init+ et \verb+MPI_recv_init+. +Optimisation. Penser à \verb+MPI_send_init+ et +\verb+MPI_recv_init+. Chaque processus ne fait que $\max \delta$ +envois et n'utilise plus ce qui a été envoyé. Idée de copier les $\max +\delta$ dans un buffer et de les envoyer avec isend. Que faire si la grille n'est pas une grille latitude-longitude ? La reconstruction de \verb+ind_extr+ dans \verb+read_snapshot+ n'est pas -- GitLab