\chapter{Fortran} \label{chap:Fortran} \index{Fortran}

Fortran (\textsc{FORmula TRANslator}) est, avec le Cobol\index{Cobol},
un des premiers langages évolués. Il a été conçu après la seconde
guerre mondiale, en 1954, par
John Warner Backus, ingénieur en radiophonie chez IBM\index{IBM},

%	========================================

\section{F77}

Dernière version à exiger le format '80 colonnes' des cartes perforées,
cette version est aussi (aux yeux de vieux dinos) la plus pure,
à cause d'instructions comme le \textsl{computed goto} ou le
mythique \textsl{comefrom}\footnote{Keyword: Datamatic}.
Nom officiel : \texttt{ANSI X3.9-1978}.

%	============****************===============

% https://linuxfr.org/users/vmagnin/journaux/taptempo-fortran

\section{Gfortan} \index{gfortran}

Puis ce langage du passé a subi une évolution lente vers quelque
chose de bien plus moderne : le Fortran 90.
Les dinos vont devoir s'adapter.
Et songer à utiliser un \texttt{gfortran} moderne,
un élément de la Gnu Compiler Collection\index{gcc}.

Comme pour tous les langages de programmation,
il est obligatoire d'avoir l'exemple canonique, donc le voilà.
Il faut l'enregister dans un fichier nommé \texttt{hello.f90}
pour que le compilateur puisse admettre que c'est écrit
en \textsl{free form format}.

\begin{verbatim}
$ cat hello.f90
program hello
    implicit none
    print *, "hello world"
end
$ gfortran -Wall hello.f90 -o hello && ./hello
 hello world
$
\end{verbatim}

% --------------------------------------------------------
%
% https://fortranwiki.org/fortran/show/Command-line+arguments
%
\section{Args \& Env}

Un fort beau programme, mais il est un peu fermé au monde extérieur.
Quand on lance un programme, il peut recevoir des instructions
par (mais pas que) deux canaux : les arguments de la ligne de commande
et les variables d'environnement.

\begin{verbatim}
program rum_me
  implicit none
  integer               :: nbarg, foo
  character(len=32)     :: arg

  nbarg = IARGC()
  if (nbarg .GT. 0) then
    do foo=1, nbarg
       call GETARG(foo, arg)
       print *, foo,"   ",  arg
    enddo
  endif
end
\end{verbatim}

Si un des arguments doir être vu comme une valeur numérique,
il faut la convertir avant usage. Exemple pour un nombre
flottant~:

\begin{verbatim}
  character(len=89)             :: arg
  real                          :: cx
  call getarg(2, string)
  read (string, *) cx
\end{verbatim}

% --------------------------------------------------------

\section{Tableaux}

Rank, Size, \textsc{allocatable}, toussa\dots

Amies du C, soyez d'entrée prévenues, en Fortran, l'indice
par défaut du premier élément d'un tableau est \textbf{1},
mais cette valeur peut être modifiée à la déclaration
du tableau.

% --------------------------------------------------------

\section{Fichiers}

Pour qui vient du C et de la philosophie Unix, la gestion
des fichiers en Fortran est assez déroutante%
\footnote{Par contre, pour un dino des \textsl{big irons}\dots}.
Il semble qu'il y ait deux concepts orthogonaux :

\begin{itemize}
\item Direct access \textit{vs.} Sequential access
\item Formtated \textit{vs.} Unformated
\end{itemize}

\textit{Open, Read, Write, Inquire, toussa\dots}

\subsection{Sequentiel texte}

XXX\index{XXX}

\subsection{Indexé} \index{index}

XXX\index{XXX}

% --------------------------------------------------------

\section{Modules}

Une notion essentielle, à mon avis, pour écrire des programmes
au-delà de 104 lignes. Oui, j'avoue, j'ai bien changé depuis
l'époque où je confectionnait des procédures \textsl{monobloc}
de 1337 lignes, avec une bonne centaine de \texttt{GOTO} dedans.

Il serait bon de voir un exemple du monde réel. Ou juste un
exemple basique. Mais avec des explications. Parce que ce n'est pas
vraiment évident. Mais c'est un concept balaize.

% --------------------------------------------------------
\section{Random et Aléa}

La dernière ligne va vous étonner.

\begin{verbatim}
    integer, dimension(3) :: tarray
    integer               :: t3
    real                  :: dummy
    call itime(tarray)
    t3 = 3600*tarray(1) + 60*tarray(2) + tarray(3)
    write(0, '(A,3I3,A,I6)') "sranding: ", tarray, " --> ", t3
    call srand(t3)
    ! after initializing the random generator engine,
    ! you MUST use it for initializing the initializer
    dummy = rand()
\end{verbatim}

% --------------------------------------------------------
% new Thu 24 Nov 2022 02:27:05 AM CET

\section{Options de gfortran} \index{gfortran}

Comme d'habitude avec gcc\footnote{The Gnu Compiler Collection}, les
options sont innombrables. J'ai essayé d'en dégager les plus importantes,
mais ce ne sont probablement pas les seules.

% --------------------------------------------------------
% new 29 decembre 2022

\section{Nombres complexes}

Partie imaginaire : \texttt{ipart = aimag(cmplx)}.

% --------------------------------------------------------

\section{Images}

La bibliothèque \textbf{Plplot} semble être un bon choix pour commencer,
mais il existe bien d'autres options.
Par exemple \textbf{g2} (page \pageref{g2}) semble être utilisable
avec les vieux F77, et possiblement avec un Fortran moderne, il faut juste
un peu de \textsc{rtfm}.

Nous allons donc commencer par Plplot, pour envisager ensuite les alternatives.

% --------------------------------------------------------

\subsection{Plplot} \index{plplot} \label{ploplt}

Commençons directement par un EMC\footnote{Exemple Minimal Compilable}
qui ne va pas faire grand chose, à part initialiser la machinerie
interne de Plplot qui est assez avancée.
Il y a beaucoup de paramètres réglables, mais aussi des fonctions
qui gèrent pour vous les valeurs « par défaut ».
Voyez cette exemple comme un \textsl{boilerplate} simple
ou un \textsc{HelloWorld}~:

\begin{verbatim}
program dessine
  use plplot
  implicit none
  call plinit ()
  call plenv(-2.1, 2.1, -2.1, 2.1, 0, 0)
  call plend
end program
\end{verbatim}

Il ne se passe pas grand chose, sauf la proposition de choisir
le type de sortie.
Dans la version que j'ai (XXX\index{XXX}), on a le choix entre
X-Window, PostScript mono ou couleur, Xfig, Null, UserMemory et SVG.
C'est intriguant de ne pas avoir au moins \textbf{un} format
pixmap\index{pixmap}.

Laissons cette question en suspens, et commençons à dessiner.
D'accord, mais dessiner quoi ?

% --------------------------------------------------------

\section{Questions}

\index{XXX}

\begin{itemize}
\item Comment déclarer une variable statique dans une procédure ?
\item Pourquoi ne pas parler de DISLIN ?
\item Est-il possible de causer à \texttt{libsndfile} ?
\item Comment caler une chaine à gauche avec un \textsc{format} ?
\item Is there a \texttt{-fortran} option for making comments with
	\texttt{figlet}\index{figlet} ?
\end{itemize}

% --------------------------------------------------------
\section{Réponses}

\textsl{<Pas de réponse>}



%	========================================
