Ada, Adapp : notice d'utilisation de la commande module

Avant-propos

La commande module est là pour répondre au plus juste à vos besoins spécifiques, pour utiliser les compilateurs, bibliothèques mathématiques ou utilitaires sans que vous ayez à en chercher l'emplacement sur les disques. Elle fonctionne en enrichissant à votre demande des variables d'environnement en fonction du produit (compilateur, débogueur, etc…) que vous souhaitez utiliser.

Syntaxe

module (avail [produit] | load produit[/version] | list | switch produit/version1 produit/version2 | display produit[/version] …)

  • ''avail'' : liste les diff√©rents produits disponibles et leurs versions,
  • ''load'' : charge le produit dans sa version par d√©faut (not√©e default), si aucune version n'est sp√©cifi√©e,
  • ''list'' : liste les diff√©rents produits charg√©s et leur version,
  • ''switch'' : change la version d'un produit d√©j√† charg√©.

produit représente au choix :

  • un mode de travail,
  • un compilateur,
  • une biblioth√®que,
  • une application ou un utilitaire.

version représente les évolutions d'un même produit, elle peut être égale à :

  • default : version par d√©faut; c'est celle qui est prise si vous ne sp√©cifiez aucune version. Cette version est en g√©n√©ral la plus adapt√©e,
  • num√©ro : num√©ro de version complet du type X.Y.Z, simplement old (version ancienne) ou new (en cours d'√©valuation par l'IDRIS) .

Initialisation de la commande module

L'initialisation de module est faite implicitement dans les fichiers d'environnement général. Il n'y a donc rien à positionner pour avoir l'accès à la commande module.

Liste des produits disponibles

Vous cherchez un produit spécifique, une version particulière d'une bibliothèque ? L'avons-nous à votre disposition ? Pour répondre à cette question, la commande à exécuter est module avail :

$ module avail

--------------------------- /smplocal/pub/Modules/IDRIS/modulefiles/environnement ---------------------------
compilerwrappers/no           modules/1.147
compilerwrappers/yes(default) modules/3.2.10(default)

--------------------------- /smplocal/pub/Modules/IDRIS/modulefiles/bibliotheques ---------------------------
arpack/96(default)               lapack/10.3.6(default)           petsc/real-hypre/3.3-p5
blas/10.3.6(default)             lapack95/10.3.6(default)         petsc/real-mumps/3.1-p8(default)
blas95/10.3.6(default)           mumps/4.10.0(default)            petsc/real-mumps/3.3-p5
cmor/2.8.1(default)              nag/23(default)                  phdf5/1.8.9(default)
fftw/2.1.5                       ncar/6.1(default)                pnetcdf/1.1.1
fftw/3.2.2                       netcdf/4.1.3                     pnetcdf/1.3.1(default)
fftw/3.3.2(default)              netcdf/mpi/4.1.3                 scalapack/10.3.6(default)
fftw/3.3.3                       netcdf/seq/4.1.3(default)        scotch/6.0.0(default)
hdf5/1.8.9(default)              p3dfft/2.5.1(default)            udunits/2.1.24(default)
hdf5/mpi/1.8.9                   parmetis/3.2.0(default)          uuid/1.6.2(default)
hdf5/seq/1.8.9                   parpack/96(default)              vtk/5.10.1(default)
hypre/2.9.0b(default)            petsc/3.1-p8

--------------------------- /smplocal/pub/Modules/IDRIS/modulefiles/applications ----------------------------
abinit/7.0.5(default)        espresso/4.3.2               namd/2.8
adf/2012.01c(default)        espresso/5.0.1(default)      namd/2.9(default)
adf/2013.01.r36703           espresso/5.0.2               nwchem/6.1.1(default)
avbp/avbp(default)           gaussian/g03_D02             siesta/2.0.2
cdo/1.5.9(default)           gaussian/g09_A02(default)    siesta/3.1(default)
cp2k/2.3_12343(default)      gromacs/4.5.5(default)       siesta/3.1-pl20
cp2k/2.4_12578               gromacsplumed/4.5.5(default) vasp/4.6.35
cpmd/3.13.2                  lammps/2012.10.10(default)   vasp/5.2.12(default)
cpmd/3.15.3(default)         molcas/7.8(default)          vasp/5.2.2
espresso/4.2.1               molpro/2010.1(default)

------------------------------ /smplocal/pub/Modules/IDRIS/modulefiles/outils -------------------------------
cmake/2.8.10.2(default)   idl/8.2(default)          papi/5.1.0.2(default)     python/3.3.0
ferret/6.84(default)      nco/4.2.3(default)        paraview/3.98(default)    totalview/8.11.0(default)
fpmpi2/2.2(default)       ncview/2.1.2(default)     python/2.7.3(default)     xmgrace/5.1.23(default)

Cette liste évolue en permanence (la liste figurant ci-dessus est celle en date d'avril 2013).

Chargement d'une application

Pour lancer une application, il faut charger le produit explicitement avant l'exécution à l'aide de la commande module load :

$ module load namd

La commande module complète alors la variable d'environnement $PATH de manière à pouvoir exécuter le produit sans positionner de chemin (absolu ou relatif) pour préciser sa localisation. On peut voir toutes les variables d'environnement positionnées par le chargement du module à l'aide de la commande module display :

$ module display namd
-------------------------------------------------------------------
/smplocal/pub/Modules/IDRIS/modulefiles/applications/namd/2.9:

conflict         namd
prepend-path     PATH /smplocal/prod/NAMD/2.9/bin
module-whatis    namd version 2.9
-------------------------------------------------------------------

Chargement d'une bibliothèque avec édition de liens implicite

Votre code fait appel à la bibliothèque NetCDF : avant de lancer la compilation, il faut charger le module correspondant à la bibliothèque par la commande module load :

$ module load netcdf

la compilation et l'édition de liens avec NetCDF se font implicitement :

$ mpiifort -c call_netcdf.f90
$ mpiifort call_netcdf.o -o call_netcdf.exe

√Čdition de liens

Les références à NetCDF seront trouvées implicitement à l'édition de liens car dans le mode par défaut (module compilerwrappers/yes) on utilise des surcharges aux compilateurs natifs (wrappers). Pour afficher les options réellement passées au compilateur, vous pouvez utilisez les options suivantes -display, -show, -#, -echo, -v à la compilation :

$  mpiifort -c -display call_netcdf.f90
# Modules - Fortran compiler wrapper
# mpiifort is /opt/intel/impi/4.0.3.008/intel64/bin/mpiifort
# mpiifort -c call_netcdf.f90 -I/smplocal/pub/NetCDF/4.1.3/seq/include

$  mpiifort -display call_netcdf.o
# Modules - Fortran compiler wrapper
# mpiifort is /opt/intel/impi/4.0.3.008/intel64/bin/mpiifort
# mpiifort  call_netcdf.o -I/smplocal/pub/NetCDF/4.1.3/seq/include -L/smplocal/pub/NetCDF/4.1.3/seq/lib -Bstatic -lnetcdff -lnetcdf
 -lnetcdf_c++ -Bdynamic -L/smplocal/pub/HDF5/1.8.9/seq/lib -Bstatic -lhdf5hl_fortran -lhdf5_hl_cpp -lhdf5_hl -lhdf5_fortran
 -lhdf5_cpp -lhdf5  -Bdynamic -lz

Exécution

L'exécutable construit avec module fait appel à des bibliothèques liées en mode statique, sauf mention contraire dans la documentation spécifique de la bibliothèque. Il n'est donc pas nécessaire de lancer une nouvelle fois module avant l'exécution.

Chargement d'une bibliothèque avec édition de liens explicite

Si vous souhaitez retrouver les compilateurs natifs et donc désactiver les wrappers, il faut procéder comme suit :

$ module purge
$ module load compilerwrappers/no      # A charger en premier
$ module load netcdf

Il faut ensuite ne pas oublier d'utiliser explicitement les variables d'environnement générées par module lors de la compilation et l'édition de liens :

$ mpiifort -c $NETCDF_FFLAGS call_netcdf.f90
$ mpiifort $NETCDF_LDFLAGS call_netcdf.o -o call_netcdf.exe

Vous pouvez visualiser les variables d'environnement produites au chargement à l'aide la commande module display :

$ module display netcdf
-------------------------------------------------------------------
/smplocal/pub/Modules/IDRIS/modulefiles/bibliotheques/netcdf/seq/4.1.3:

conflict         netcdf
prepend-path     PATH /smplocal/pub/NetCDF/4.1.3/seq/bin
prepend-path     MANPATH /smplocal/pub/NetCDF/4.1.3/seq/share/man
prepend-path     WRAPPER_FFLAGS -I/smplocal/pub/NetCDF/4.1.3/seq/include
prepend-path     WRAPPER_CXXFLAGS -I/smplocal/pub/NetCDF/4.1.3/seq/include
prepend-path     WRAPPER_LDFLAGS -L/smplocal/pub/NetCDF/4.1.3/seq/lib -Bstatic -lnetcdff -lnetcdf -lnetcdf_c++ -Bdynamic -L/smplocal/pub/HDF5/1.8.9/seq/lib -Bstatic -lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5 -Bdynamic -lz
setenv           WRAPPER_PATH /smplocal/pub/Modules/IDRIS/wrappers
prepend-path     PATH /smplocal/pub/Modules/IDRIS/wrappers
module-whatis    netcdf seq 4.1.3
-------------------------------------------------------------------

Chargement d'un produit contenant différentes versions

Un produit (application, bibliothèque, outils, …) peut comporter plusieurs versions ou une hiérarchie de versions, mais il n'a qu'une seule version par défaut (étiquette default). Voici deux exemples indiquant les différentes syntaxes possibles pour charger un produit :

  • L'application Quantum ESPRESSO comporte plusieurs versions :
$ module avail espresso
------------------------------- /smplocal/pub/Modules/IDRIS/modulefiles/applications --------------------------------
espresso/4.2.1          espresso/4.3.2          espresso/5.0.1(default) espresso/5.0.2
  • Pour charger la version par d√©faut espresso/5.0.1, on peut faire :
$ module load espresso
$ module load espresso/5.0.1
  • Par contre pour charger espresso/5.0.2, il faut pr√©ciser la version :
$ module load espresso/5.0.2
  • Autre exemple : la biblioth√®que HDF5 comporte 2 sous-versions (parall√®le mpi et s√©quentielle seq) :
$ module avail hdf5
------------------------------- /smplocal/pub/Modules/IDRIS/modulefiles/bibliotheques -------------------------------
hdf5/mpi/1.8.9          hdf5/seq/1.8.9(default)
  • Les syntaxes suivantes sont autoris√©es pour charger la version par d√©faut hdf5/seq/1.8.9 :
$ module load hdf5
$ module load hdf5/seq
$ module load hdf5/seq/1.8.9
  • Pour charger hdf5/mpi/1.8.9, on pourra faire :
$ module load hdf5/mpi
$ module load hdf5/mpi/1.8.9

Liste des produits chargés

$ module list
Currently Loaded Modulefiles:
  1) espresso/5.0.1            2) hdf5/seq/1.8.9(default)

Changement de version d'un produit déjà chargé

Cela n'est bien entendu envisageable que si une version alternative appara√ģt dans la liste donn√©e par module avail. Par exemple, la version par d√©faut de Quantum ESPRESSO ne vous convient pas ? Vous pouvez la remplacer par une autre version disponible en utilisant l'argument switch de la commande module.

$ module switch espresso/5.0.1 espresso/5.0.2

Avec cette commande, on utilisera Quantum ESPRESSO version 5.0.2, au lieu de la version 5.0.1.

Effets de bord à éviter

L'utilisation de la commande module peut générer des messages sur la la sortie standard stdout. C'est un comportement à éviter absolument si la commande est placée dans un fichier ~/.bashrc ou ~/.tcshrc car cela nuit aux comportements de commandes telles que rsh ou ssh. Dans un shell non interactif, ces messages peuvent être désactivés à l'aide de l'option -s :

$ module -s load netcdf