\section{Généralités informatiques \label{sc:informatic}}

\subsubsection*{Modularité}

L'organisation du modèle LMDZ est très étroitement calquée sur la
distinction entre partie "dynamique" -- la seule partie où soient pris en
compte des échanges horizontaux entre des mailles du modèle -- et la
partie ``physique'' qui peut être vue comme une juxtaposition de ``colonnes''
d'atmosphère.

Cette spécificité de la partie physique est exploitée en ce sens que
le codage de toutes les paramétrisations est fait avec un indice
interne muet qui représente la grille horizontale.
Cette organisation est illustrée sur la \fig{physdyn}.
Chacune des parties, physique et dynamique, a ses propres fichiers
de conditions initiales et de sorties.

\begin{figure} [h]
\centerline{\includegraphics[width=10cm]{\local/physdyn}}
\caption{Séparation entre les parties dynamique 3D et physique 1D du code
LMDZ.\label{fg:physdyn}}
\end{figure}

Cette écriture se prête à la fois à la vectorisation et
à la parallélisation des codes.
Cette approche permet également de disposer de façon transparente
d'une version unidimensionnelle du modèle de circulation.
Cette approche permet également de disposer de façon transparente
d'une version unidimensionnelle du modèle de circulation.
Pour disposer d'un modèle unidimensionnel, il suffit d'écrire un programme
dans lequel on initialise des profils météorologiques sur
un point particulier du globe et dans lequel on appelle ensuite
en boucle le moniteur physique.

Autre atout important, cette conception modulaire permet de gérer
en parallèle des ``physiques'' différentes interfacées avec le même code
dynamique. Ce point est essentiel pour les études menées au LMD sur Mars et
sur Titan.
Enfin, on peut noter qu'il existe aussi une version bidimensionnelle,
latitude-altitude, du noyau dynamique
du modèle qui a été abondamment utilisée sur Titan comme on le voit
à la fin de ce document.

\subsubsection*{Le code : architecture, compilation}

Lorsque vous sortez LMDZ4 du dépôt SVN, vous obtenez au plus haut niveau la
liste suivante de fichiers et répertoires.
\begin{verbatim}
arch/       create_make_gcm*  libf/          offline.def   physiq.def
bld.cfg     gcm.def           makegcm*       orchidee.def  run.def
build_gcm*  guide.def         makelmdz_fcm*  output.def    traceur.def
\end{verbatim}
(l'étoile signale les exécutables). Les huit fichiers \verb+.def+
servent à l'exécution des programmes \verb+create_etat0_limit+ et
\verb+gcm+. Le répertoire \verb+libf+ contient les fichiers sources en
Fortran. Les autres fichiers et répertoire de cette liste :
\begin{verbatim}
arch/  bld.cfg  build_gcm*  create_make_gcm*  makegcm*  makelmdz_fcm*
\end{verbatim}
servent à la compilation. Le répertoire \verb+arch+ contient les
informations spécifiques aux différents compilateurs et machines. Deux
méthodes de compilation indépendantes peuvent être utilisées. L'une
utilise les scripts \verb+create_make_gcm+ et \verb+makegcm+, l'autre
les fichiers \verb+makelmdz_fcm+, \verb+bld.cfg+  et
\verb+build_gcm+. Dans le répertoire \verb+libf+, la logique de la
répartition dans les sous-répertoires est la suivante :
\begin{description}
\item[\texttt{bibio}] : en principe des procédures pour les
  entrées-sorties, ou des procédures numériques générales
  (indépendantes de LMDZ) ;
\item[\texttt{dyn3d}] : la partie dynamique du programme, dans sa
  configuration séquentielle ;
\item[\texttt{dyn3dpar}] : l'équivalent de \verb+dyn3d+ pour la
  configuration parallèle ;
\item[\texttt{filtrez}] : le filtre longitudinal, pour les régions
  polaires ;
\item[\texttt{grid}] : le maillage ;
\item[\texttt{phylmd}] : la partie physique du programme.
\end{description}
Normalement, en dehors de \verb+dyn3d+ et \verb+dyn3dpar+, les
fichiers sont les mêmes pour les configurations séquentielle et
parallèle (en particulier la partie physique est la même).

Tout le programme est écrit en Fortran. Il a pour ambition d'être
conforme à la norme Fortran 95. Les fichiers ont pour suffixes
\verb+.F+ (format fixe, avec directives pour le préprocesseur),
\verb+.f90+ (format libre, sans directive pour le préprocesseur),
\verb+.F90+ (format libre, avec directives pour le préprocesseur) ou
\verb+.h+ (fichiers inclus, normalement conformes à la fois au format
fixe et au format libre).

Quelques détails sur la compilation avec \verb+makelmdz_fcm+. Les
macros destinées au préprocesseur sont choisies d'une part dans le
script \verb+makelmdz_fcm+, d'autre part dans le fichier de
configuration \verb+arch.fcm+. Les macros choisies par
\verb+makelmdz_fcm+ sont dans la variable \verb+CPP_KEY+. Les macros
choisies par \verb+arch.fcm+ sont dans la variable \verb+FPP_DEF+.
Dans le fichier \verb+blg.cfg+, on lit que ces deux ensembles de
macros sont utilisés par le préprocesseur :
\begin{verbatim}
bld::tool::fppkeys   %CPP_KEY %FPP_DEF
\end{verbatim}
\verb+makelmdz_fcm+ choisit les macros selon la configuration du
programme, indépendamment du compilateur. Pour la configuration par
défaut (c'est-à-dire sans autre option que \verb+-arch+ sur la ligne
de commande), \verb+makelmdz_fcm+ sélectionne les macros
\verb+CPP_IOIPSL+ et \verb+CPP_PHYS+.

La résolution spatiale du modèle est spécifiée dans le fichier
\verb+grid/dimensions.h+. \verb+makelmdz_fcm+ crée le fichier
\verb+dimensions.h+ via le script \verb+grid/dimension/makdim+.

