! From: "COMPUTATIONAL PHYSICS 2nd Ed" ! by RH Landau, MJ Paez, and CC Bordeianu ! Copyright Wiley - VCH, 2007. ! Electronic Materials copyright: R Landau, Oregon State Univ, 2007; ! MJ Paez, Univ Antioquia, 2007; and CC Bordeianu, Univ Bucharest, 2007. ! Supported by the US National Science Foundation ! ! slit.f90: Solves time - dependent Schroedinger equation for a ! two - dimensional Gaussian wavepacket entering a slit Program slit Implicit none Real*8 :: psr(91, 91, 2), psi(91, 91, 2), v(91, 91), p2(91, 91) Real*8 :: a1, a2, dt, dx, k0x, k0y, x0, y0, x, y Integer i, j, k, max, n, time Complex exc, zi ! input positive int proportional to time for plot write(*, *)'Enter a positive Integer from 1(initial time)' write(*, *)'to 800 to get wave packet position at that time' read(*, *)time write(*, *)'processing data for time', time open(9, FILE = 'slit.dat', Status = 'Unknown') ! initialize constants and wave packet zi = cmplx(0.0, 1.0) dx = 0.2 dt = 0.0025/(dx*dx) ! initial momentum, position k0x = 0.0; k0y = 2.5 x0 = 0.0; y0 = - 7.0 max = 90 ! clear the arrays Do i = 1, 91 Do j = 1, 91 Do k = 1, 2 psi(i, j, k) = 0.0 psr(i, j, k) = 0.0 End Do End Do End Do ! initial wave function y = - 9.0 Do j = 1, max + 1 x = - 9.0d0 Do i = 1, max + 1 exc = exp(zi*(k0x*x + k0y*y)) a1 = exp( - 0.5*(((x - x0))**2 + ((y - y0))**2)) psr(i, j, 1) = real(a1*exc) ! real part psi(i, j, 1) = aimag(a1*exc) ! imaginay part x = x + dx End Do y = y + dx End Do ! set potential slit width: 50 - 40 = 10 units Do j = 1, max + 1 Do i = 1, max + 1 If ((j == 35).and.((i < 40).or.(i > 51)))then v(i, j) = 0.5 else v(i, j) = 0.0 Endif End Do End Do ! propagate psi through time Do n = 1, time ! compute real wave packet and probability Do j = 2, max Do i = 2, max a2 = v(i, j)*psi(i, j, 1) + 2.0d0*dt*psi(i, j, 1) a1 = psi(i+1,j,1) + psi(i-1,j,1) +psi(i,j+1,1) + psi(i,j-1,1) psr(i, j, 2) = psr(i, j, 1) - dt*a1 + 2.0*a2 If (n == time) then p2(i,j) = psr(i,j,1)*psr(i,j,1) + psi(i,j,1)*psi(i, j, 1) Endif End Do psr(1, j, 2) = psr(2, j, 2)! at x edges derivative =0 psr(max + 1, j, 2) = psr(max, j, 2) End Do ! imaginary part of psi Do j = 2, max Do i = 2, max a2 = v(i, j)*psr(i, j, 2) + 2.0*dt*psr(i, j, 2) a1 = psr(i+1,j,2) + psr(i-1,j,2) +psr(i,j-1,2) + psr(i,j+1,2) psi(i, j, 2) = psi(i, j, 1) + dt*a1 - 2.0*a2 End Do psi(1, j, 2) = psi(2, j, 2)! at x edges derivative =0 psi(max + 1, j, 2) = psi(max, j, 2) End Do ! new -> old Do j = 1, max + 1 Do i = 1, max + 1 psi(i, j, 1) = psi(i, j, 2) psr(i, j, 1) = psr(i, j, 2) End Do End Do End Do ! write probabilities & potential scaled by 0.025 (to fit) Do j = 2, max, 3 Do i = 2, max, 2 write(9, 11)p2(i, j) + v(i, j) End Do write(9, *) ' ' End Do 11 format (E12.6) close(9) Stop 'data saved in slit.dat' End