Branche Amaury dev
Ceci est une page temporaire qui commente certains aspects de la branche Amaury_dev en attendant qu'elle soit mergée
La branche Amaury_dev vise à moderniser une grande partie du code de LMDZ, en partant de r5056.
Les grands changements (r5155) sont :
- Le remplacement de nombreux
INCLUDE *.h
par des modules, en particulier cela remplace un certain nombre deCOMMON
- La conversion de tous les fichiers fixed-form
*.F
en free-form*.[fF]90
- Le remplacement d'un certain nombre d'utilisations de clés CPP par des booléens Fortran, et la création de wrappers associés au besoin
- Le remplacement des appels à la librairie netcdf-fortran77 par la librairie netcdf-fortran90 (ce qui vire les
INCLUDE "netcdf.h"
) - La suppression / déplacement dans
obsolete
de code très ancien et inutilisé - La correction de la plupart des warnings de compilation
gfortran
- La mise à jour des sources FCM à la dernière version (mais sans passer à FCM2, on utilise encore les options legacy)
- La correction de bugs mineurs (e.g. type casting) et majeurs (e.g. mauvais indices de boucles, appels erronés) trouvés lors du nettoyage
- Le renommage des modules en
lmdz_*
pour éviter les collisions de namespace - L'harmonisation de la syntaxe Fortran (cf LMDZ_code_guidelines)
- Un linting de la plupart des fichiers
Sommaire
Convergence
La version r5157 (=r5155 + hotfix cosp) est quasiment convergée partout, et peut servir de référence :
# Tests auto de convergence All good ! for r5155/r5017=-rad oldrad -parallel none -veget none -compilephysiq lmd All good ! for r5155/r5017=-rad oldrad -parallel mpi_omp -veget none -compilephysiq lmd All good ! for r5155/r5017=-rad oldrad -parallel none -veget CMIP6 -compilephysiq lmd All good ! for r5155/r5017=-rad oldrad -parallel mpi_omp -veget CMIP6 -compilephysiq lmd All good ! for r5155/r5017=-rad rrtm -parallel none -veget none -compilephysiq lmd All good ! for r5155/r5017=-rad rrtm -parallel mpi_omp -veget none -compilephysiq lmd All good ! for r5155/r5017=-rad rrtm -parallel none -veget CMIP6 -compilephysiq lmd All good ! for r5155/r5017=-rad rrtm -parallel mpi_omp -veget CMIP6 -compilephysiq lmd All good ! for r5155/r5017=-rad ecrad -parallel none -veget none -compilephysiq lmd All good ! for r5155/r5017=-rad ecrad -parallel mpi_omp -veget none -compilephysiq lmd All good ! for r5155/r5017=-rad ecrad -parallel none -veget CMIP6 -compilephysiq lmd All good ! for r5155/r5017=-rad ecrad -parallel mpi_omp -veget CMIP6 -compilephysiq lmd All good ! for r5155/r5017=-debug -rad oldrad -parallel none -veget none -compilephysiq lmd All good ! for r5155/r5017=-debug -rad oldrad -parallel mpi_omp -veget none -compilephysiq lmd All good ! for r5155/r5017=-rad oldrad -parallel none -veget none -compilephysiq lmd -d 79 All good ! for r5155/r5017=-rad oldrad -parallel none -veget none -compilephysiq lmdiso -d 48x36x39 All good ! for r5157/r5150=-xios -rad oldrad -parallel mpi_omp -veget none -compilephysiq lmd All good ! for r5157/r5017=-cosp v1 -rad oldrad -parallel mpi_omp -veget none -compilephysiq lmd
(XIOS est testé vs 5150 car il segfault sur 5017)
Opérations mises "de côté"
Remplacement de FCTTRE.h
FCTTRE.h
contient des fonctions "en ligne", syntaxe qui est dépréciée. De plus, c'est utilisé via un INCLUDE
.
Cependant, si on met ces fonctions dans un module à part (indépendament de questions de performance), on perd la convergence compilo car l'optimisation réalisée n'est pas la même.
Il sera donc intéressant, une fois qu'on est sur une version dont on est bien confiant, de tester cette migration, tant en performance qu'en résultats.
Remplacement du commun comgeom
Le common /comgeom/
est partagé entre lmdz_comgeom.f90
et lmdz_comgeom2.f90
, afin de pouvoir de manière transparents passer les même tableaux en tant que 1D ou 2D.
Cette utilisation est dépréciée par Fortran, mais pas triviale à changer en module.
Une solution serait de passer par des pointeurs et une routine d'initialisation.
Common iniCOSP
Le common défini dans ini_COSP.h
est un peu tricky à remplacer car il a besoin de klon,klev
qui ne sont pas des constantes.
Une (bonne) manière de faire serait de faire un type dérivé. C'est d'ailleurs ce que je préconise pour remplacer les très longues listes d'arguments, mais c'est à discuter avec le reste du groupe...
Vitesse
A titre indicatif, quelques stats. Attention à l'interprétation (variabilité interne, etc.), la quantité intéressant est le min
.
r5158 v r5017
séquentiel
r5017:
- compil lmdz:
Time (mean ± σ): 152.594 s ± 62.315 s | Range (min … max): 109.719 s … 263.752 s 10 runs
- bench:
Time (mean ± σ): 123.119 s ± 42.065 s | Range (min … max): 89.570 s … 200.606 s 10 runs
r5158
- compil lmdz:
Time (mean ± σ): 111.737 s ± 4.910 s | Range (min … max): 106.716 s … 118.421 s 10 runs
- bench:
Time (mean ± σ): 92.876 s ± 2.105 s | Range (min … max): 87.766 s … 94.780 s 10 runs
mpi_omp
r5017:
- compil lmdz:
Time (mean ± σ): 119.116 s ± 4.124 s | Range (min … max): 114.514 s … 125.466 s 10 runs
- bench:
Time (mean ± σ): 50.382 s ± 0.994 s | Range (min … max): 49.248 s … 52.130 s 10 runs
r5158
- compil lmdz:
Time (mean ± σ): 130.779 s ± 5.543 s | Range (min … max): 123.503 s … 139.438 s 10 runs
- bench:
Time (mean ± σ): 52.444 s ± 1.080 s | Range (min … max): 51.387 s … 54.530 s 10 runs
r5159
This rev replaces all INCLUDE "dimensions.h",INCLUDE"paramet.h"
by modules. One could think this would impact performance.
The bench suggests otherwise:
Seq: Time (mean ± σ): 101.333 s ± 20.405 s | Range (min … max): 91.460 s … 150.911 s 10 runs
Para: Time (mean ± σ): 49.341 s ± 0.353 s | Range (min … max): 48.740 s … 50.028 s 10 runs