# Light absorption by a three level atom

Gold Member

## Homework Statement

We have 2 laser beams counter propagating through a cavity with an atom traveling at some velocity. So one laser beam is propagating left and the other right. One laser beam has an intensity of .05*I_sat and the other 10*I_sat. The goal is to get the transmittance (or transmission, I think they're the same thing, and they seem to be used interchangeably throughout the paper). The lasers output the same frequency light.

The wavelengths of light that excite the atom to the excited states are:
##\lambda_1 = 600.00000nm##
##\lambda_2 = 599.99904nm##
We have a radiative lifetime of 30 ns for both states.

## Homework Equations

From the book, we have transmittance is
##1 - \frac{I_{sat}}{2\langle I(0) \rangle } K(\omega , v)L##
with L the length of the cavity (doesn't matter)

We assume a few things, and are given that
##K(\omega , v)L =
\left \{ \begin{array}{ll}
f(v)dv, & if | \omega - \frac{2\pi c}{\lambda_1} - \frac{2\pi v}{\lambda_1} | \\
f(v)dv, & if | \omega - \frac{2\pi c}{\lambda_2} - \frac{2\pi v}{\lambda_2} | \\
0, & otherwise \end{array} \right. ##

with
##f(v) = \sqrt{\frac{m}{2\pi k_B T}}exp(-\frac{mv^2}{2k_B T}##
and
##\frac{m}{2k_B T} = 1.700 x 10^{-5}##

## The Attempt at a Solution

[/B]
Python:
from __future__ import division
from numpy import sqrt, pi, exp, zeros
import matplotlib.pyplot as plt
import random
#from pylab import nbytes
#import numpy

c = 299792458

lambda1 = 600*10**(-9)
lambda2 = 59999904*10**(-9)

const = 1.7 * 10**(-5)
tauR = 30*10**(-9)

f1 = c/lambda1
flow = f1-800*10**6
fhigh = f1+800*10**6
fstep = 1*10**6

frequency = zeros((fhigh-flow)/fstep)
Transmission = zeros((fhigh-flow)/fstep)

vlow = -1200
vhigh = 1200
vstep = 1

def f(v):
distribution = sqrt(const/pi)*exp(-const*v**2)
return distribution

def K(w,v):
if abs(w- 2*pi*c/lambda1 - 2*pi*v/lambda1)<= 1/(2*tauR) :
y = f(v)
elif abs(w- 2*pi*c/lambda2 - 2*pi*v/lambda2)<= 1/(2*tauR) :
y = f(v)
else:
y = 0

return y*vstep

def T(w,v):
transmittance = 1/(2*.05)*K(w,v)
return transmittance
Tboth = zeros(50)
Tone = zeros(35000)
Kone = zeros(35000)
Fone = zeros(35000)

www = zeros(50)
both = 0
one = 0
none = 0
Req1 = 0
# T vs. w
ww = 0
vv = 0
kmax = 5 #number of samples per velocity point
argL1 = zeros(((fhigh-flow)/fstep,kmax))
argL2 = zeros(((fhigh-flow)/fstep,kmax))

while ww < (fhigh-flow)/fstep:
frequency[ww] = flow + ww*fstep
while vv < (vhigh - vlow)/vstep:
for k in range(kmax):
if abs(2*pi*frequency[ww]- 2*pi*c/lambda1 - 2*pi*(vlow +vv*vstep)/lambda1)<= 1/(2*tauR) \
and abs(2*pi*frequency[ww]- 2*pi*c/lambda1 + 2*pi*(vlow +vv*vstep)/lambda1)<= 1/(2*tauR) \
or abs(2*pi*frequency[ww]- 2*pi*c/lambda2 - 2*pi*(vlow +vv*vstep)/lambda2)<= 1/(2*tauR) \
and abs(2*pi*frequency[ww]- 2*pi*c/lambda2 + 2*pi*(vlow +vv*vstep)/lambda2)<= 1/(2*tauR):
both+=1
argL1[ww,k] = 1
argL2[ww,k] = 1
www[both-1] = ww
r = random.randrange(1,201,1)
if r == 1:
Transmission[ww] = Transmission[ww] + T(2*pi*frequency[ww],vv) #let the atom encounter light 201 times, since the probability is 1 in 201
Transmission[ww] = 1 - Transmission[ww]/kmax #Normalize the point
Tboth[both-1]= Transmission[ww]
Req1 +=1
elif abs(2*pi*frequency[ww]- 2*pi*c/lambda1 - 2*pi*(vlow +vv*vstep)/lambda1)<= 1/(2*tauR) \
or abs(2*pi*frequency[ww]- 2*pi*c/lambda2 - 2*pi*(vlow +vv*vstep)/lambda2)<= 1/(2*tauR):
argL1[ww,k] = 1
Transmission[ww] = Transmission[ww] + T(2*pi*frequency[ww],vv)
Transmission[ww] = 1 - Transmission[ww]/kmax
Tone[one] = Transmission[ww]
Kone[one] = K(2*pi*frequency[ww],vlow+vv*vstep)
Fone[one] = f(vlow+vv*vstep)
one +=1
else:
none +=1

vv+=1
vv=0
ww+=1
plt.plot(frequency,Transmission)
plt.ylabel('Transmission')
plt.xlabel('Frequency of light')
plt.axis([flow,fhigh,0,1.2])
plt.show()

The comments are a little sparse, so let me explain a bit.
I think the definitions are pretty self explanatory if you read section 2.
vlow, vhigh, flow, and fhigh are the range of frequencies and velocites that we're looking over. They were given as "reasonable values" in the assignment.
Tboth, Tone, Kone, Fone are all checks. Same with both, one, none, req1, argL1, argL2, and www. They don't do anything other than store values for me to look at for troubleshooting.
Tboth stores the value of the transmittance function T(w,v) iff the atom can absorb light from both lasers (k(w,v)L is non zero for both lasers and the current velocity)
Tone stores T(w,v) if only the weak laser can be absorbed.
Kone stores K if only the weak laser can be absorbed.
Fone stores f if only the weak laser can be absorbed

both, one, and none store the number of times both lasers, the weak laser, and neither of the lasers can be absorbed.

argL1 stores 1 if the inequality holds for the weak laser, 0 if it doesn't. argL2 same but for the strong laser.

www stores the values of ww (my incrementer for the frequencies) that both lasers can be absorbed by. It turns out to be f1 +/- 2, so I'm centered at 800, and I get 1's from 798-802 and zeros everywhere else.

Loops
Check that we're in our range of frequencies
store the current frequency.
check to see that we're in our range of velocities

(run multiple trials for a particular velocity at a given laser frequency)
check to see if the inequality holds true for excited state 1 OR 2 in the weak laser AND the strong laser
[set check variables]
take into account the probability of the atom absorbing a photon from the small laser
store the transmission value from the transmission function
store a check value (req1 tells me how many times both could be absorbed and it chose the weak laser)

check to see if only the weak laser can be absorbed for either excited state
set transmission value
set check values

check to see if neither can be absorbed
set check values

adjust counters (because I'm a control freak partly, and sometimes my math in the range() function was returning floats, rather than ints)

plot

[END PSEUDO CODE]

A few things. If you adjust vstep to 5 or 10 (those were the values I started with originally), you get periodic values for K, and other related functions. The argL1, for vstep = 10, would return 1 for ww= 1,2,3, then 0 for the next 11, then 1 for the next 5, 0 for the next 11, etc. until you get around f1 (about ww= 800 with the current set of fstep), then it was 0 for 29 of them, i believe. I have no idea why.

I think I have a logic error somewhere in my loops, but I'm not sure what I'm doing wrongly.

If I left anything out that isn't self explanatory, let me know, and I will explain my thinking for it.

What it is supposed to look like, is high on the ends, gradually dipping to zero at f1 (1.1 on the graph), with 3 vertical spikes, one of which is at f1, and I'm assuming one to the left and the other to the right, somewhere.

#### Attachments

• output.png
24.9 KB · Views: 284

## Answers and Replies

mfb
Mentor
lambda2 = 59999904*10**(-9)
That number doesn't look right. Does it help to fix that? Didn't check all the remaining code in detail.
Some clean-up for the very long if X and Y or ... expressions would simplify the code.

Gold Member
There should have been a decimal in there. I'm not sure why there wasn't.
Thanks.

Gold Member
I'll have to rerun it to see if it fixes it. It takes really long, as I have to immensely shrink my sample rates. When I ran my friends code, it took me 6 hours to complete because my computer is a dinosaur.