2.14 FORTRAN77-90-95 : filiation et diff´erences
2.14.5 R´ecursivit´e
a la suite les unes des autres en m´emoire simplement en incr´ementant un pointeur, ce qui revient au mˆeme, si ce n’est que c’est d’un maniement sensiblement plus d´elicat. . .
Les pointeurs sont importants en informatique parce que c’est le point de d´epart de l’allocation dynamique de m´emoire, puisqu’on acc`ede ainsi librement `a toute la m´emoire sans en r´eserver des morceaux `a telle ou telle vari-able.fortran90g`ere l’allocation dynamique de m´emoire autrement, comme on l’a vu, et -opinion qui n’engage que son auteur- de fa¸con nettement plus prudente.
Autant dire que pour l’essentiel du calcul scientifique, la capacit´e `a utiliser des tableaux efficacement est beau-coup plus importante. Toutefois,fortran90introduit les pointeurs avec un certain nombre de garde-fous.
Un pointeur doit ˆetre d´eclar´e avec le type de la variable vers lequel il pointe : un pointeur donn´e ne peut pas avoir pour cible un entier `a un moment et un r´eel un peu plus tard :
! declaration d’un pointeur vers un entier integer, pointer :: a
! declaration d’un pointeur vers un tableau reel real, dimension(:), pointer :: b
Il faut aussi d´eclarer explicitement des variables comme cible (target en anglais) :
integer, target :: n, m
real, dimension(150), target :: x, y
Si l’on veut queapointe versmetbversx, cela donne : a => m
b => x
Quel int´erˆet ? On peut, par exemple, faire pointer un poin-teur vers un morceau de tableau
b => x(100:150)
ce qui permet d’optimiser des transferts de donn´ees d’un morceau de tableau `a un autre : dans certains cas on
´economise ainsi de l’espace m´emoire.
2.14.5 R´ ecursivit´ e.
fortran90 l’autorise. . . c’est parfois commode, rarement efficace, du moins pour le calcul scientifique pur et dur. L’exemple que l’on donne toujours est le calcul de factorielles : la d´efinition den! est,
n! =n(n−1)!
Cela se programme sans difficult´e `a condition de sp´ecifier que la function est r´ecursive :
program factorielle implicit none integer :: n, fact
write(*,’("Entrer un entier : ",$)’) ; read(*,*) n write(*,*)"Factorielle", n," vaut ",fact(n) end
recursive function fact(n) result(f) implicit none
integer, intent(in) :: n integer :: f
if ( n > 1 ) then
f = n*fact(n-1) ! ici la fonction s’appelle
! elle-meme, c’est recursif else
f = 1 endif
end function fact
Cinq minutes de r´eflexion permettent cependant de re´ecrire la fonction :
integer function fact(n) implicit none
integer, intent(in) :: n integer :: f = 1
if ( n > 1 ) then do i = 2, n
f = f*i ! ici, ca n’a rien de recursif enddo
endif fact = f
end function fact
La deuxi`eme version est plus efficace parce que la premi`ere devra stocker tous les r´esultats interm´ediaires en m´emoire de fa¸con parfaitement inutile, ce que la deuxi`eme ne fait
´evidemment pas.
La r´ecursivit´e est une question importante pour les informaticiens dans la mesure o`u elle leur facilite con-sid´erablement la tˆache dans, par exemple, des probl`emes de logique tournant autour de la d´ecidabilit´e (Entschei-dungsproblem quand on veut montrer que l’on a de l’´education. . .). Pour un physicien qui se borne en g´en´eral
`a utiliser des algorithmes standards, cela reste assez marginal.
—
Apr`es cette premi`ere partie, on constate donc que le langage fortran90 est tr`es riche et que l’on peut faire avec ce langage des choses plutˆot ´elabor´ees. Il n’est bien sˆur pas utile d’apprendre tous les d´etails du langage en quelques semaines, mais il est indispensable d’en avoir une pratique suffisante pour ne pas ˆetre gˆen´e par des d´etails de programmation pendant les s´eances de travaux pratiques, au cours desquelles, tr`es rapidement, on se pr´eoccupera plus de physique que de langage ! Il est recommand´e d’ˆetre capable, assez rapidement, d’´ecrire sans trop h´esiter des programmes comportantconditions, boucles, tableaux, sous-programmes et entr´ees-sorties : le reste viendra avec la pratique, mais,
les bases doivent ˆ etre imp´ erativement apprises et maˆıtris´ ees, car sans cela, on s’expose ` a patauger sans grand profit dans un bourbier de d´ etails informa-tiques sans int´ erˆ et !
Ces remarques ach`event la partie langage de ce cours.
Dans la suite, les exemples seront donn´es enfortran, mais les algorithmes ´etudi´es ne d´ependent ´evidemment pas du langage de programmation choisi.
40 Licence de physique L3 : PHYTEM, Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Chapitre 3
Un prototype de TP
3.1 Introduction.
La physique num´erique requiert sans doute quelques connaissances dont le pr´esent cours a pour but de fournir l’essentiel. Il s’agit toutefois d’une activit´e essentiellement pratique : il faut ´ecrire des programmes qui, non seule-ment ≪ marchent≫, mais aussi r´epondent aux questions pos´ees de sorte que la physique du probl`eme soit trait´ee de fa¸con satisfaisante ; il faut pour cela un minimum d’-exp´erience pour, bien sˆur, maˆıtriser le langage, mais en outre avoir une familiarit´e suffisante avec l’environnement et les m´ethodes afin que ceux-ci deviennent l’aide puis-sante qu’ils doivent ˆetre et non plus la gˆene. . . qu’ils con-stituent sans conteste au d´ebut ! C’est la raison pour laque-lle cet enseignement comporte une part importante de travaux pratiques.
Chacune de ces s´eances de TP est consacr´ee `a un probl`eme de physique qui illustre l’usage que l’on peut faire de telle ou telle m´ethode. Elle est pr´ec´ed´ee d’une s´eance de travaux dirig´es au cours de laquelle on pr´esente le probl`eme, ´eventuellement on montre les limites du cal-cul analytique et on d´ecrit les m´ethodes num´eriques qui seront utilis´ees pour le traiter. Si le probl`eme pr´esente des difficult´es particuli`eres de programmation, celles-ci seront
´egalement abord´ees.
Il est attendu des ´etudiants qu’ils arrivent en s´eance de TP en ayant 1opris connaissance du probl`eme et 2oavec une bonne id´ee de comment le r´esoudre et qu’ils en par-tent en rendant un compte-rendu qui compte pour la note de contrˆole continu.
La question est ´evidemment :≪que doit-il y avoir dans un compte-rendu de TP ? ≫ Comme il s’agit d’un exer-cice un peu particulier, on traite ci-dessous, `a titre d’ex-emple, la question de de la lentille demi-boule ≪ `a la mani`ere ≫d’un TP. . .