Compare commits

...

4 Commits

Author SHA1 Message Date
tTh 0db76fef58 assez pour ce soir 2023-03-21 00:16:54 +01:00
tTh aa4f0664cb premier dessin avec plplot 2023-03-07 20:49:36 +01:00
tTh 04eeae6de9 cosmetic 2023-03-06 14:43:24 +01:00
tTh aa3d078e21 tweak fortran pages 2023-03-04 12:48:05 +01:00
9 changed files with 273 additions and 45 deletions

View File

@ -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}

View File

@ -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
% ========================================

View File

@ -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
% ------------------------------------------------

View File

@ -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
View File

@ -0,0 +1,6 @@
plplotting
dessiner
*.png

8
code/fortran/Makefile Normal file
View 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
View 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

View 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

View File

@ -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}