
Nous discrétisons les espaces x et y suivant des intervalles Δx et Δy, et le temps t suivant des intervalles Δt. En utilisant les expressions discrétisées des dérivées secondes, l'équation précédente se transforme comme

Cette équation peut encore se mettre sous-la forme

Le choix idéal pour Δt est ici donné par

Nous placerons une source sinusoïdale d'amplitude 1 et de fréquence ν = 2 Hertz en (Lx/3,Ly/2). L'amplitude de l'onde en i=Nx/3 et j=Ny/2 sera donc modifiée à chaque étape comme

Pour la première étape de propagation (de t=0 à t=Δt), on pose à nouveau que z(i,j,-1)=z(i,j,1). Ceci permet d'écrire

Les étapes de propagation suivantes se font alors suivant l'équation donnée précédemment. A ce stade, on pose toujours que


L'extension de cette fente suivant x correspond à l'intervalle [(10/21)Lx,(11/21)Lx]. Les deux trous suivant y correspondent aux intervalles [(43/100)Ly,(46/100)Ly] et [(54/100)Ly,(57/100)Ly]. On introduit cette fente dans nos simulations en appliquant à chaque étape un "masque de zéros" aux points associés avec cette fente. Ceci introduit en effet une réflection des ondes incidentes, exactement comme aux limites du système.

Les ondes sont-elles encore réfléchies ?
Ces relations, déterminées heuristiquement à partir de nos observations pour le cas unidimensionnel, définissent des "conditions frontières absorbantes d'ordre 1" (on peut les appliquer telles quelles lorsque Δt = sqrt(Δx2+Δy2) / 2v. Elles sont surtout efficaces pour des ondes ayant une incidence perpendiculaire aux limites du système. Pour des ondes plus inclinées, une certaine réflection apparaît. Il existe des "conditions frontières absorbantes d'ordre 2" ainsi que d'autres méthodes plus efficaces en électromagnétisme.
Voici le Makefile à utiliser avec le gfortran (le programme principal doit s'appeler Wave2D.f90).
Map.
Celle-ci vous permet de visualiser une fonction z=z(x,y) en faisant simplement
call Map(list_x, list_y, list_z). Vous devez pour cela
inclure use MapPack dans les parties de vos programmes
qui utilisent Map.
Vous trouverez plus de détails sur
son utilisation dans les commentaires préliminaires
du fichier.
Pour obtenir une image animée, vous devez faire
call Map(list_x, list_y, list_z, keep=.true., refresh=.false.)
lors de la première utilisation et
call Map(list_x, list_y, list_z, keep=.true., refresh=.true.)
ensuite.
Finalement, pour stabiliser l'échelle de gris, vous pouvez ajouter les arguments
suivants:
zmin=-0.75_r, zmax=0.75_r.
PgMap.
Celle-ci s'utilise de manière similaire à Map.
Pour représenter une fonction z=z(x,y), il suffit en effet de
faire
call PgMap(list_x, list_y, list_z).
Vous devez pour cela inclure use PgMapPack dans les parties de vos programmes
qui utilisent PgMap. Vous trouverez plus de détails sur son utilisation dans
les commentaires préliminaires du fichier.