TetaTricks/chap/Fortran.tex

225 lines
6.6 KiB
TeX
Raw Normal View History

2020-12-12 14:13:54 +11:00
\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},
2021-12-24 06:06:52 +11:00
% ========================================
2020-12-12 14:13:54 +11:00
\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
2022-12-17 06:41:32 +11:00
mythique \textsl{comefrom}\footnote{Keyword: Datamatic}.
Nom officiel : \texttt{ANSI X3.9-1978}.
2020-12-12 14:13:54 +11:00
2022-01-01 10:04:23 +11:00
% ============****************===============
% https://linuxfr.org/users/vmagnin/journaux/taptempo-fortran
2021-12-24 06:06:52 +11:00
\section{Gfortan} \index{gfortran}
2020-12-12 14:13:54 +11:00
Puis ce langage du passé a subi une évolution lente vers quelque
2021-12-24 06:06:52 +11:00
chose de bien plus moderne : le Fortran 90.
2022-12-17 06:41:32 +11:00
Les dinos vont devoir s'adapter.
Et songer à utiliser un \texttt{gfortran} moderne,
2022-02-16 10:53:49 +11:00
un élément de la Gnu Compiler Collection\index{gcc}.
2021-12-24 06:06:52 +11:00
2022-02-16 10:53:49 +11:00
Comme pour tous les langages de programmation,
il est obligatoire d'avoir l'exemple canonique, donc le voilà.
2021-12-24 06:06:52 +11:00
Il faut l'enregister dans un fichier nommé \texttt{hello.f90}
2022-01-01 10:04:23 +11:00
pour que le compilateur puisse admettre que c'est écrit
en \textsl{free form format}.
2021-12-24 06:06:52 +11:00
\begin{verbatim}
2022-01-01 10:04:23 +11:00
$ cat hello.f90
2021-12-24 06:06:52 +11:00
program hello
implicit none
print *, "hello world"
end
2022-01-01 10:04:23 +11:00
$ gfortran -Wall hello.f90 -o hello && ./hello
hello world
$
2021-12-24 06:06:52 +11:00
\end{verbatim}
2022-01-20 09:31:51 +11:00
% --------------------------------------------------------
2022-04-03 20:56:49 +11:00
%
% https://fortranwiki.org/fortran/show/Command-line+arguments
%
2022-01-20 09:31:51 +11:00
\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}
2022-02-16 10:53:49 +11:00
Si un des arguments doir être vu comme une valeur numérique,
2022-06-10 06:08:46 +11:00
il faut la convertir avant usage. Exemple pour un nombre
flottant~:
2022-02-16 10:53:49 +11:00
\begin{verbatim}
2022-12-17 06:41:32 +11:00
character(len=89) :: arg
real :: cx
call getarg(2, string)
read (string, *) cx
2022-02-16 10:53:49 +11:00
\end{verbatim}
2022-01-01 10:04:23 +11:00
% --------------------------------------------------------
2021-12-24 06:06:52 +11:00
2022-04-03 20:56:49 +11:00
\section{Tableaux}
2021-12-24 06:06:52 +11:00
2022-01-20 09:31:51 +11:00
Rank, Size, \textsc{allocatable}, toussa\dots
2022-01-01 10:04:23 +11:00
2022-04-03 20:56:49 +11:00
Amies du C, soyez d'entrée prévenues, en Fortran, l'indice
2022-12-17 06:41:32 +11:00
par défaut du premier élément d'un tableau est \textbf{1},
2022-04-03 20:56:49 +11:00
mais cette valeur peut être modifiée à la déclaration
du tableau.
2022-01-01 10:04:23 +11:00
% --------------------------------------------------------
2022-04-03 20:56:49 +11:00
\section{Fichiers}
2022-02-16 10:53:49 +11:00
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}.
2023-01-01 01:39:58 +11:00
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}
2022-02-16 10:53:49 +11:00
2022-04-01 23:23:45 +11:00
\textit{Open, Read, Write, Inquire, toussa\dots}
2022-02-16 10:53:49 +11:00
2022-12-17 06:41:32 +11:00
\subsection{Sequentiel texte}
XXX\index{XXX}
\subsection{Indexé} \index{index}
XXX\index{XXX}
2022-02-16 10:53:49 +11:00
% --------------------------------------------------------
2022-04-03 20:56:49 +11:00
\section{Modules}
2022-01-01 10:04:23 +11:00
Une notion essentielle, à mon avis, pour écrire des programmes
2022-01-20 09:31:51 +11:00
au-delà de 104 lignes. Oui, j'avoue, j'ai bien changé depuis
2022-02-16 10:53:49 +11:00
l'époque où je confectionnait des procédures \textsl{monobloc}
de 1337 lignes, avec une bonne centaine de \texttt{GOTO} dedans.
2021-12-24 06:06:52 +11:00
2022-12-17 06:41:32 +11:00
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.
2022-04-01 23:23:45 +11:00
% --------------------------------------------------------
2022-04-03 20:56:49 +11:00
\section{Random et Aléa}
2022-04-01 23:23:45 +11:00
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}
2022-01-01 10:04:23 +11:00
2022-12-17 06:41:32 +11:00
% --------------------------------------------------------
% 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.
2023-01-01 01:39:58 +11:00
% --------------------------------------------------------
% new 29 decembre 2022
\section{Nombres complexes}
Partie imaginaire : \texttt{ipart = aimag(cmplx)}.
2022-01-01 10:04:23 +11:00
% --------------------------------------------------------
2022-04-03 20:56:49 +11:00
\section{Images}
2022-01-01 10:04:23 +11:00
2022-06-10 06:08:46 +11:00
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
2022-06-24 12:19:32 +11:00
avec les vieux F77, et possiblement avec un Fortran moderne, il faut juste
un peu de \textsc{rtfm}.
2022-12-17 06:41:32 +11:00
Nous allons donc commencer par Plplot, pour envisager ensuite les alternatives.
2022-06-24 12:19:32 +11:00
% --------------------------------------------------------
2022-06-10 06:08:46 +11:00
\subsection{Plplot} \index{plplot} \label{ploplt}
2022-06-24 12:19:32 +11:00
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}.
2022-06-10 06:08:46 +11:00
2022-06-24 12:19:32 +11:00
Laissons cette question en suspens, et commençons à dessiner.
D'accord, mais dessiner quoi ?
2022-06-10 06:08:46 +11:00
% --------------------------------------------------------
\section{Questions}
2022-06-24 12:19:32 +11:00
\index{XXX}
2022-06-10 06:08:46 +11:00
2022-06-24 12:19:32 +11:00
\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} ?
2022-12-17 06:41:32 +11:00
\item Comment caler une chaine à gauche avec un \textsc{format} ?
2022-06-24 12:19:32 +11:00
\end{itemize}
2022-01-01 10:04:23 +11:00
% ========================================