diff --git a/chap/Fortran.tex b/chap/Fortran.tex index 05cf761..19a8f3c 100644 --- a/chap/Fortran.tex +++ b/chap/Fortran.tex @@ -1,13 +1,15 @@ \chapter{Fortran} \label{chap:Fortran} \index{Fortran} +\begin{quote} 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}, +\end{quote} % ======================================== -\section{F77} +\section{FORTRAN77} Dernière version à exiger le format '80 colonnes' des cartes perforées, cette version est aussi (aux yeux de vieux dinos) la plus pure, @@ -15,6 +17,10 @@ cette version est aussi (aux yeux de vieux dinos) la plus pure, mythique \textsl{comefrom}\footnote{Keyword: Datamatic}. Nom officiel : \texttt{ANSI X3.9-1978}. +L'incarnation \texttt{g77}\index{g77} n'existe plus, meis peut être +à-priori émulable en jouant avec les options de \texttt{gfortran} +et un brin de shell. + % ============****************=============== % https://linuxfr.org/users/vmagnin/journaux/taptempo-fortran @@ -33,7 +39,7 @@ 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} +\begin{lstlisting} $ cat hello.f90 program hello implicit none @@ -42,7 +48,7 @@ end $ gfortran -Wall hello.f90 -o hello && ./hello hello world $ -\end{verbatim} +\end{lstlisting} % -------------------------------------------------------- % @@ -55,7 +61,7 @@ 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} +\begin{lstlisting} program rum_me implicit none integer :: nbarg, foo @@ -69,18 +75,18 @@ program rum_me enddo endif end -\end{verbatim} +\end{lstlisting} Si un des arguments doir être vu comme une valeur numérique, -il faut la convertir avant usage. Exemple pour un nombre -flottant~: +il faut convertir la chaine de caractères avant usage. +Exemple pour un nombre flottant~: -\begin{verbatim} +\begin{lstlisting} character(len=89) :: arg real :: cx call getarg(2, string) read (string, *) cx -\end{verbatim} +\end{lstlisting} % -------------------------------------------------------- @@ -91,7 +97,32 @@ 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. +du tableau. Ce qui permet des \textsl{of-by-anynumber} +du plus bel effet. + +% -------------------------------------------------------- +% new 29 decembre 2022 + +\section{Nombres complexes} + +Partie imaginaire : \texttt{ipart = aimag(cmplx)}. + +% -------------------------------------------------------- +% nouveau 4 mars 2023 + +\section {Les structures}\index{type} + +Une « structure », c'est comme une petite boite dans laquelle on peut +mettre des variables de différentes natures. + +\begin{lstlisting} +type t_pixrgb + integer :: r, g, b + integer :: alpha = 0 +end type +\end{lstlisting} + +Nous verrons plus loin l'importance de cette notion. % -------------------------------------------------------- @@ -130,12 +161,39 @@ 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. +Nous allons donc créer un module qui ne fait quasiment rien, ce qui +limitera le nombre de pannes possibles dans la suite des opérations. + +\begin{lstlisting} +module dummy + implicit none +contains +subroutine print_dummy + print *, 'this is the dummy subroutine' +end subroutine +end module +\end{lstlisting} + +Rien de bien compliqué~: +Un module peut être vu comme une boite qui contient (\texttt{contains}) +des procédures (\texttt{function} ou \texttt{subroutine}, +et qui sera utilisé avec ce genre de petit programme~: + +\begin{lstlisting} +program t + use dummy + implicit none + print *, '=== programme de test ===' + call print_dummy +end program +\end{lstlisting} + % -------------------------------------------------------- \section{Random et Aléa} La dernière ligne va vous étonner. -\begin{verbatim} +\begin{lstlisting} integer, dimension(3) :: tarray integer :: t3 real :: dummy @@ -146,7 +204,7 @@ La dernière ligne va vous étonner. ! after initializing the random generator engine, ! you MUST use it for initializing the initializer dummy = rand() -\end{verbatim} +\end{lstlisting} % -------------------------------------------------------- % new Thu 24 Nov 2022 02:27:05 AM CET @@ -157,13 +215,6 @@ 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} @@ -177,7 +228,9 @@ un peu de \textsc{rtfm}. Nous allons donc commencer par Plplot, pour envisager ensuite les alternatives. % -------------------------------------------------------- - +% +% $ dillo /usr/share/doc/plplot-doc/html/index.html & +% \subsection{Plplot} \index{plplot} \label{ploplt} Commençons directement par un EMC\footnote{Exemple Minimal Compilable} @@ -188,15 +241,7 @@ 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} +\lstinputlisting{code/fortran/plplotting.f90} Il ne se passe pas grand chose, sauf la proposition de choisir le type de sortie. diff --git a/code/fortran/Makefile b/code/fortran/Makefile new file mode 100644 index 0000000..cd10fef --- /dev/null +++ b/code/fortran/Makefile @@ -0,0 +1,5 @@ + +INCS = -I/usr/include/plplot -I/usr/lib/x86_64-linux-gnu/fortran/modules/plplot + +plplotting: plplotting.f90 Makefile + gfortran -g $< $(INCS) -lplplotfortran -o $@ diff --git a/code/fortran/plplotting.f90 b/code/fortran/plplotting.f90 new file mode 100644 index 0000000..10ecb5c --- /dev/null +++ b/code/fortran/plplotting.f90 @@ -0,0 +1,8 @@ +program plplotting + use plplot + implicit none + + call plinit () + call plenv(-2.1, 2.1, -2.1, 2.1, 0, 0) + call plend +end program diff --git a/tetatricks.tex b/tetatricks.tex index 2ccdab1..e176ec7 100644 --- a/tetatricks.tex +++ b/tetatricks.tex @@ -26,7 +26,7 @@ %------ reglages des 'listings' \lstset{frame=single} % dessin d'un cadre autour du listing \lstset{basicstyle=\ttfamily\small} -\lstset{aboveskip=1.2em,belowskip=1.2em} +\lstset{aboveskip=1.0em,belowskip=1.0em} \setcounter{tocdepth}{1} \pagestyle{plain}