Compare commits
4 Commits
6c2d6476b8
...
0db76fef58
Author | SHA1 | Date | |
---|---|---|---|
|
0db76fef58 | ||
|
aa4f0664cb | ||
|
04eeae6de9 | ||
|
aa3d078e21 |
@ -19,6 +19,7 @@ Dans un premier temps, je vais les lister sommairement, et
|
||||
ensuite j'aurais une idée sur lesquels seront les plus funs
|
||||
à explorer.
|
||||
|
||||
Dartmouth Time Sharing System
|
||||
|
||||
% -------------------------------------------
|
||||
\section{Bywater} \index{bywater}
|
||||
|
196
chap/Fortran.tex
196
chap/Fortran.tex
@ -1,13 +1,19 @@
|
||||
\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}
|
||||
|
||||
Pourquoi j'ai redécouvert un langage de ma jeunesse, et pourquoi
|
||||
vous devriez vous aussi y jeter un regard attentif. Il y a plein
|
||||
de bonnes choses, la septième va vous tenir compagnie.
|
||||
|
||||
% ========================================
|
||||
|
||||
\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 +21,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 +43,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 +52,7 @@ end
|
||||
$ gfortran -Wall hello.f90 -o hello && ./hello
|
||||
hello world
|
||||
$
|
||||
\end{verbatim}
|
||||
\end{lstlisting}
|
||||
|
||||
% --------------------------------------------------------
|
||||
%
|
||||
@ -50,12 +60,13 @@ $
|
||||
%
|
||||
\section{Args \& Env}
|
||||
|
||||
Un fort beau programme, mais il est un peu fermé au monde extérieur.
|
||||
Un fort beau programme que ce \textsc{helloworld}, 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}
|
||||
\begin{lstlisting}
|
||||
program rum_me
|
||||
implicit none
|
||||
integer :: nbarg, foo
|
||||
@ -69,18 +80,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 +102,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.
|
||||
|
||||
% --------------------------------------------------------
|
||||
|
||||
@ -113,10 +149,15 @@ Il semble qu'il y ait deux concepts orthogonaux :
|
||||
|
||||
XXX\index{XXX}
|
||||
|
||||
Pour faire simple, on accède à chaque unité de donnée l'une après l'autre,
|
||||
comme quand on déroule une bande 6250bpi.
|
||||
|
||||
\subsection{Indexé} \index{index}
|
||||
|
||||
XXX\index{XXX}
|
||||
|
||||
C'est pas pareil.
|
||||
|
||||
% --------------------------------------------------------
|
||||
|
||||
\section{Modules}
|
||||
@ -130,12 +171,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 +214,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,27 +225,22 @@ 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
|
||||
Par exemple \textbf{g2} (vue en 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.
|
||||
|
||||
% --------------------------------------------------------
|
||||
|
||||
%
|
||||
% $ 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,29 +251,83 @@ qui gèrent pour vous les valeurs « par défaut ».
|
||||
Voyez cette exemple comme un \textsl{boilerplate} simple
|
||||
ou un \textsc{HelloWorld}~:
|
||||
|
||||
\lstinputlisting{code/fortran/plplotting.f90}
|
||||
|
||||
Il ne se passe pas grand chose, sauf qu'on a une 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, PNG, SVG, et bien
|
||||
d'autres dont certains, pour moi, assez ésotériques.
|
||||
D'autre part, avec cette méthode, il semble impossible de
|
||||
préciser la taille de l'image.
|
||||
Mais la démonstration est faite.
|
||||
|
||||
Il faut quand même regarder de plus près la subroutine
|
||||
\texttt{plenv()} (\textsl{Set up standard window and draw box})
|
||||
qui initialise simplement un contexte graphique 2D somme toute
|
||||
assez classique. Elle prend six paramètres. Les quatre premiers
|
||||
sont les coordonnées flottantes de deux coins du papier,
|
||||
le cinquième controle l'échelle des axes, et le dernier
|
||||
controle le tracé des boites autour du graphique.
|
||||
|
||||
Nous avons les bases, commençons donc à dessiner.
|
||||
|
||||
Premièrement, nous allons chosir de démarrer automatiquement
|
||||
dans une fenètre X11,
|
||||
en gardant le reste de la configuration avec ses valeurs par défaut.
|
||||
Pour cela, il suffit de rajouter \texttt{call plsdev('xwin')} juste avant
|
||||
l'appel à \texttt{plinit}, il vous faudra utiliser la touche
|
||||
\textsl{<enter>} pour sortir\footnote{Une de mes prochaines tâche sera
|
||||
de regarder comment quitter avec le '\textbf{q}' canonique}.
|
||||
|
||||
Ensuite, pour mettre en évidence notre art,
|
||||
nous allons choisir une couleur pour l'encre (qui est d'un
|
||||
rouge du meilleur effet par défaut en mode "xwin"),
|
||||
puis écrire quelques légendes canoniques, donc inutiles, .
|
||||
|
||||
\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
|
||||
call plcol0 (15) ! pure white
|
||||
call pllab ("Fuzzfactor", "Yoyodines", "Some nice plots")
|
||||
\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}.
|
||||
Il est maintenant temps de poser un premier trait de crayon numérique
|
||||
sur notre feuille blanche numérique\footnote{Actuellement noire, mais
|
||||
nous trouverons bien comment changer ça}.
|
||||
La forme de ce tracé sera donnée par une suite de coordonnées
|
||||
flottantes \textsl{x/y}
|
||||
stockées dans deux tableaux parallèles que nous allons
|
||||
immédiatement garnir de données pertinentes~:
|
||||
|
||||
Laissons cette question en suspens, et commençons à dessiner.
|
||||
D'accord, mais dessiner quoi ?
|
||||
\begin{verbatim}
|
||||
integer, parameter :: lg = 500
|
||||
real :: x(lg), y(lg)
|
||||
real :: k
|
||||
integer :: i
|
||||
k = 0.1
|
||||
do i = 1, lg
|
||||
x(i) = k * sin(real(i)/3.0)
|
||||
y(i) = k * cos(real(i)/5.0)
|
||||
k = k * 1.006021
|
||||
enddo
|
||||
\end{verbatim}
|
||||
|
||||
Une fois en possession de ces données conceptuelles, que l'on peut
|
||||
aisément voire comme un cheminement, nous allons demander
|
||||
au crayon de se promener sur notre feuille virtuelle en suivant
|
||||
ce chemin~:
|
||||
|
||||
\begin{verbatim}
|
||||
call plcol0 (12)
|
||||
call plline (x, y)
|
||||
\end{verbatim}
|
||||
|
||||
Au passage, vous pouvez remarquer la magie du Fortran moderne~:
|
||||
il n'est plus nécessaire de signifier la dimension des tableaux
|
||||
lors de l'appel de la procédure.
|
||||
|
||||
% --------------------------------------------------------
|
||||
|
||||
\section{Questions}
|
||||
\section{Questions en attente}
|
||||
|
||||
\index{XXX}
|
||||
|
||||
@ -220,7 +337,7 @@ D'accord, mais dessiner quoi ?
|
||||
\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} ?
|
||||
\texttt{boxes} + \texttt{figlet}\index{figlet} ?
|
||||
\end{itemize}
|
||||
|
||||
% --------------------------------------------------------
|
||||
@ -228,6 +345,7 @@ D'accord, mais dessiner quoi ?
|
||||
|
||||
\textsl{<Pas de réponse>}
|
||||
|
||||
Voilà, c'est tout pour le moment\dots
|
||||
|
||||
|
||||
% ========================================
|
||||
|
@ -170,7 +170,6 @@ nous aurons toujours la même séquence en sortie.
|
||||
\subsection{Trucs à voir}
|
||||
|
||||
\begin{verbatim}
|
||||
|
||||
#declare VIRGINIA =
|
||||
transform {
|
||||
matrix < 1, 1, 0,
|
||||
@ -184,6 +183,12 @@ transform {VIRGINIA}
|
||||
}
|
||||
\end{verbatim}
|
||||
|
||||
% ================================================
|
||||
|
||||
\section{Avec Fortran}
|
||||
|
||||
plplot
|
||||
|
||||
|
||||
% ------------------------------------------------
|
||||
|
||||
|
@ -107,6 +107,12 @@ préciser le coef de qualité ( qscale : 1 = le mieux / 3 = correcte )
|
||||
|
||||
https://engineering.giphy.com/how-to-make-gifs-with-ffmpeg/ \index{gif89a}
|
||||
|
||||
\begin{verbatim}
|
||||
ffmpeg -ss 0:5:59.600 -to 0:6:11.150 -i Downloads/foo.mp4 tmp/tragic.gif
|
||||
\end{verbatim}
|
||||
|
||||
% -----------------------------------------------------------------
|
||||
|
||||
\subsection{Encoder un cloître}
|
||||
|
||||
Là, nous sommes dans du \textsl{serious bizness}, puisque cette vidéo
|
||||
|
6
code/fortran/.gitignore
vendored
Normal file
6
code/fortran/.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
|
||||
plplotting
|
||||
dessiner
|
||||
|
||||
*.png
|
||||
|
8
code/fortran/Makefile
Normal file
8
code/fortran/Makefile
Normal file
@ -0,0 +1,8 @@
|
||||
|
||||
INCS = -I/usr/include/plplot -I/usr/lib/x86_64-linux-gnu/fortran/modules/plplot
|
||||
|
||||
plplotting: plplotting.f90 Makefile
|
||||
gfortran -g $< $(INCS) -lplplotfortran -o $@
|
||||
|
||||
dessiner: dessiner.f90 Makefile
|
||||
gfortran -g $< $(INCS) -lplplotfortran -o $@
|
66
code/fortran/dessiner.f90
Normal file
66
code/fortran/dessiner.f90
Normal file
@ -0,0 +1,66 @@
|
||||
program dessiner
|
||||
use plplot
|
||||
implicit none
|
||||
|
||||
integer :: i
|
||||
real :: a, b, c, d
|
||||
|
||||
character(len=80) :: version
|
||||
call plgver(version)
|
||||
write (*,'(a,a)') 'plplot version: ', trim(version)
|
||||
|
||||
call plsdev('xwin')
|
||||
call plinit ()
|
||||
|
||||
call plenv(-2.2, 2.2, -2.2, 2.2, 0, 1)
|
||||
|
||||
a = 0
|
||||
b = 0
|
||||
c = 0
|
||||
d = 0
|
||||
do i=1, 100
|
||||
a = a + 0.01
|
||||
b = b + 0.02
|
||||
call dessin_1 (a, b, 12)
|
||||
c = c + 0.03
|
||||
d = d + 0.04
|
||||
call dessin_1 (c, d, 13)
|
||||
enddo
|
||||
|
||||
call plend
|
||||
|
||||
contains ! -----------------------------
|
||||
!------------------------------------------------------
|
||||
subroutine dessin_1 (sha, shb, color)
|
||||
real, intent(in) :: sha, shb
|
||||
integer, intent(in) :: color
|
||||
|
||||
integer, parameter :: lg = 2000
|
||||
real :: x(lg), y(lg)
|
||||
real :: k, amp
|
||||
integer :: i
|
||||
|
||||
! print *, 'dessin 1'
|
||||
amp = 2.0
|
||||
do i = 1, lg
|
||||
k = real(i)/real(lg) * 6.2832 * 4.0
|
||||
x(i) = amp * sin((k+sha)*5)
|
||||
y(i) = amp * cos((k+shb)*3)
|
||||
enddo
|
||||
! print *, k, x(i), y(i)
|
||||
|
||||
call plcol0 (15) ! pure white
|
||||
call pllab ("Fuzzfactor", "Yoyodines", "Some nice plots from tTh")
|
||||
call plcol0 (color)
|
||||
call plline (x, y)
|
||||
|
||||
end subroutine
|
||||
!------------------------------------------------------
|
||||
subroutine dessin_2 ()
|
||||
|
||||
print *, 'dessin 2'
|
||||
|
||||
end subroutine
|
||||
!------------------------------------------------------
|
||||
|
||||
end program
|
17
code/fortran/plplotting.f90
Normal file
17
code/fortran/plplotting.f90
Normal file
@ -0,0 +1,17 @@
|
||||
program plplotting
|
||||
use plplot
|
||||
implicit none
|
||||
|
||||
! Initializing the plotting package with a lot of
|
||||
! default (and pertinent) values.
|
||||
call plinit ()
|
||||
|
||||
! Sets up plotter environment for simple graphs
|
||||
call plenv (-2.1, 2.1, -2.1, 2.1, 0, 0)
|
||||
|
||||
! Ends a plotting session, tidies up all the output
|
||||
! files,switches interactive devices back into text
|
||||
! mode and frees up any memory that was allocated.
|
||||
call plend ()
|
||||
|
||||
end program
|
@ -5,7 +5,7 @@
|
||||
% Décembre, ça n'avance pas beaucoup...
|
||||
%
|
||||
|
||||
\usepackage[francais]{babel}
|
||||
\usepackage[french]{babel}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage{xspace}
|
||||
\usepackage{makeidx}
|
||||
@ -21,12 +21,12 @@
|
||||
\makeindex
|
||||
|
||||
\setlength \parindent {2em}
|
||||
\setlength \parskip {0.3333333em} % XXX
|
||||
\setlength \parskip {0.33em} % XXX
|
||||
|
||||
%------ 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}
|
||||
@ -50,7 +50,8 @@
|
||||
% ==============================================================
|
||||
\chapter{Introduction}
|
||||
|
||||
Un nouveau nouvel ouvrage, en vrac, complètement coronavraqué.
|
||||
Un nouveau nouvel ouvrage, en vrac.
|
||||
|
||||
Des notes informelles sur l'utilisation
|
||||
d'un ordinateur moderne, vous allez en avoir vraiment beaucoup.
|
||||
Mais elles sont en vrac, et surtout, elles sont reprises
|
||||
@ -141,7 +142,7 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
|
||||
% \input{chap/astronomie}
|
||||
% \input{chap/MINITEL}
|
||||
% \input{chap/Raspberry}
|
||||
\input{chap/Fedora}
|
||||
% \input{chap/Fedora}
|
||||
% \input{chap/IPv6}
|
||||
\input{chap/threads}
|
||||
\input{chap/IPC}
|
||||
|
Loading…
Reference in New Issue
Block a user