Lectures10 11 Practice
Lectures10 11 Practice
Lectures10 11 Practice
Sauro Succi
October 6, 2016
1 Quantum codelets
We present three sample codelets
1. harmo.f: Harmonic oscillator Schroedinger, using Modified Visscher Method
2. kg.f: Free particle Klein-Gordon, using standard Leapfrog
3. qlb.f: Free particle Dirac, using Quantum Lattice Boltzmann
1
2 Schroedinger for the Harmonic Oscillator
It can be used for other potentials as well, including the free-particle case
(V (x) = 0).
c solve the 1d Schroedinger equation for the harmonic oscillator
c using Modified Visscher method
c S. Succi, AC274 Fall Semester 2016,
c --------------------------------------------------------
parameter (nx=501)
dimension Aold(nx),A(nx),Anew(nx)
dimension Bold(nx),B(nx),Bnew(nx)
dimension x(nx),vpot(nx)
dimension hc(nx),hw(nx),he(nx)
dimension jw(nx),je(nx)
c ------------------------------------
open(21,file=’rhoAB.out’)
open(31,file=’movie.out’)
open(9,file=’diagno.out’)
c ------------- -------------------------
pi = 4.0*atan(1.0)
dif = 1.0 ! hbar/m in natural units hbar=m=1
omh = 1.0 ! harmonic frequency
vamp = 0.0 ! set zero to run free particle
vel = 10. ! initial speed of the wavepacket
sigma = 1./2. ! initial spread of the coherent wavepacket
c the harmonic length hl = sqrt(dif/omh)
hlen = sqrt(dif/omh)
htim = 2.0*pi/omh
2
delta = dif*dt/(dx*dx)
alfa = vel*dt/dx
omega = vmax*dt
write(6,*) ’sizex,sigma’,sizex,sigma
write(6,*) ’dx,dt’,dx,dt
write(6,*) ’alfa,delta,omega’,alfa,delta,omega
c initial conditions
do j=1,nx
x(j) = dx*(float(j-(nx-1)/2))
xj = x(j)
rho = exp(-0.25*xj*xj/sigma/sigma)
Aold(j) = rho*cos(vel*xj)
Bold(j) = rho*sin(vel*xj)
rhoA = Aold(j)*Aold(j)
rhoB = Bold(j)*Bold(j)
vpot(j) = vmax*0.5*omh*omh*xj*xj
write(21,*) xj,Aold(j),Bold(j),vpot(j)
write(31,*) xj,rhoA,rhoB,rho,vpot(j)/vmax
end do
write(31,’(bn)’)
write(31,’(bn)’)
c -------------------------------------
c prepare time-independent quantities
do j=1,nx
c periodic bc via indirect address
je(j) = j+1
if(je(j).gt.nx) je(j)=1
jw(j) = j-1
if(jw(j).lt.1) jw(j)=nx
omega = vpot(j)*dt
c discretized Hamiltonian: once and for all for simplicity
hc(j) = delta+omega
hw(j) = -delta/2.
he(j) = -delta/2.
3
c Euler start-up
hB = hc(j)*Bold(j)+hw(j)*Bold(jw(j))+he(j)*Bold(je(j))
A(j) = Aold(j)+hB
hA = hc(j)*Aold(j)+hw(j)*Aold(jw(j))+he(j)*Aold(je(j))
B(j) = Bold(j)-hA
end do
do it=2,nt
do j=1,nx
hB = hc(j)*B(j)+hw(j)*B(jw(j))+he(j)*B(je(j))
Anew(j) = Aold(j)+2.0*hB
end do
do j=1,nx
hA = hc(j)*A(j)+hw(j)*A(jw(j))+he(j)*A(je(j))
Bnew(j) = Bold(j)-2.0*hA
end do
do j=1,nx
Aold(j) = A(j)
Bold(j) = B(j)
A(j) = Anew(j)
B(j) = Bnew(j)
end do
c diagnostic
if(mod(it,200).eq.1) then
tmass = 0.0
ave = 0.0
var = 0.0
epot = 0.0
ekin = 0.0
do j=1,nx
rhoA = A(j)*A(j)
rhoB = B(j)*B(j)
rho = rhoA + rhoB
tmass = tmass+ rho*dx
ave = ave + x(j)*rho*dx
var = var + x(j)*x(j)*rho*dx
dA = 0.5*(A(je(j))-A(jw(j)))/dx
dB = 0.5*(B(je(j))-B(jw(j)))/dx
4
epot = epot + vpot(j)*rho*dx
write(31,*) x(j),rhoA,rhoB,rho,vpot(j)/vmax
end do
ave = ave/tmass
rms = sqrt(var/tmass-ave*ave)
write(6,*) ’total mass’,it,tmass,ave,rms,epot,ekin
write(9,*) it,tmass,ave,rms,epot,ekin
write(31, ’(bn)’)
write(31, ’(bn)’)
endif
c ================================================
end do
stop
end
5
3 Klein-Gordon
This solves the Klein-Gordon equation in d=1 using a standard Leapfrog method.
The diagnostic has no physical meaning because the density of the KG field
needs to be defined via time derivatives. We did not implement it because it is
notoriously ill-posed (non-positive definite).
sizex = 1.0
dx = 2*sizex/float(nx-1)
dt = dx/cvel
nt = 4*nx ! 4 is arbitrary
write(6,*) ’nx,nt,dx,dt’,nx,nt,dx,dt
alfa = 1.0
sigma = 10.0*dx ! play with 10
c initial conditions
do j=1,nx
x(j) = dx*(float(j-(nx-1)/2))
xj = x(j)
fj = exp(-0.25*xj*xj/sigma/sigma)
gj =-0.5*xj*fj/(sigma*sigma)
psiold(j) = fj
psi(j) = psiold(j)+0.0*cvel*gj*dt ! zero time derivative at t=0
c note rho is NOT a proper density
c because of interference between Left and right movers
rho = psi(j)*psi(j)
write(31,*) xj,rho,psi(j)
end do
write(31,’(bn)’)
6
write(31,’(bn)’)
c -------------------------------------
c periodic bc via index arrays
do j=1,nx
je(j) = j+1
if(je(j).gt.nx) je(j)=1
jw(j) = j-1
if(jw(j).lt.1) jw(j)=nx
end do
c now unleash the time engine
om2 = (omegac*dt)**2
alf2 = alfa*alfa
ct alf2 = 0.0 ! standing oscillations
do it=1,nt
do j=1,nx
psilap=alf2*(psi(je(j))-2.0*psi(j)+psi(jw(j)))
psinew(j)=(2.0-om2)*psi(j)-psiold(j)+psilap
end do
c newstep
do j=1,nx
psiold(j) = psi(j)
psi(j) = psinew(j)
end do
c printout (but again, rho is NOT a proper density)
c so the moments have not much meaning, as you will see by yourself...
if(mod(it,10).eq.1) then
tmass = 0.0
ave = 0.0
var = 0.0
do j=1,nx
rho = psi(j)*psi(j)
tmass = tmass+rho*dx
ave = ave + x(j)*rho*dx
var = var + x(j)*x(j)*rho*dx
write(31,*) x(j),rho,psi(j)
end do
ave = ave/tmass
rms = sqrt(var/tmass -ave*ave)
write(6,*) ’total mass’,it,tmass,ave,rms
write(9,*) it,tmass,ave,rms
write(31, ’(bn)’)
write(31, ’(bn)’)
endif
7
c ================================================
end do
stop
end
8
4 Free Dirac particle in d=1, using Quantum
Lattice Boltzmann
This show that Qunatum LB scheme in action for d=1 Dirac equation. Two
complex wavefunctions, up and down movers which propagate and mix trough
a mass ”collision” matrix. They map to a slow and fast modes, the latter
vanishing in the non-relativistic limit β = v/c → 0. In the same limit, the slow
mode obeys the Schroedinger equation.
ci = (0.0,1.0)
omc = 0.1 ! Compton
sigma = 50.0 ! 50 is a guideline value
beta = 0.1 ! v/c
om2 = omc*omc
sigma2 = sigma*sigma
a = (1.0-0.25*om2)/(1.0+0.25*om2)
b = omc/(1.0+0.25*om2)
write(6,*) a*a+b*b
c -------------------------------------------
nstep = 1000
do j=1,nx
x = float(j-nx/2)
x2 = x*x/sigma2
rho = exp(-0.25*x2)
phi = beta*x
u(j) = rho*exp(+ci*phi)
d(j) = rho*exp(-ci*phi)
d(j) = -ci*u(j) ! kill the fast mode (u-id), play with it
9
end do
do 10 it=1,nstep
u(0) = u(nx)
d(0) = d(nx)
u(nx+1) = u(1)
d(nx+1) = d(1)
c qlb rule
do j=1,nx
unew(j) = a*u(j-1)+b*d(j-1)
dnew(j) =-b*u(j+1)+a*d(j+1)
end do
c new timestep
do j=1,nx
u(j) = unew(j)
d(j) = dnew(j)
end do
c output
if(mod(it,10).eq.1) then
phase = exp(ci*it)
rhomass = 0.
do j=1,nx
rho = u(j)*conjg(u(j))+d(j)*conjg(d(j))
rhomass = rhomass+rho
c these are the plus (slow) and minus (fast) modes
c the fast mode should scale like beta^2 hence disappear in the NR limit
psip = phase*(u(j)+ci*d(j))/sqrt(2.0)
psim = phase*(u(j)-ci*d(j))/sqrt(2.0)
rhop = psip*conjg(psip)
rhom = psim*conjg(psim)
write (31,*) j,rho,rhop,rhom
end do
write (31,’(bn)’)
write (31,’(bn)’)
write(6,*) ’mass’,rhomass
endif
10 continue
stop
end
10