1. Limited time only! Sign up for a free 30min personal tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Homework Help: Light absorption by a three level atom

  1. Dec 6, 2016 #1


    User Avatar
    Gold Member

    1. The problem statement, all variables and given/known data
    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.

    2. Relevant 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. ##

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

    3. The attempt at a solution

    Code (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)        
            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):
                    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
                    none +=1
    plt.xlabel('Frequency of light')
    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.

    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)



    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.

    Attached Files:

  2. jcsd
  3. Dec 10, 2016 #2


    User Avatar
    2017 Award

    Staff: Mentor

    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.
  4. Dec 14, 2016 #3


    User Avatar
    Gold Member

    There should have been a decimal in there. I'm not sure why there wasn't.
  5. Dec 14, 2016 #4


    User Avatar
    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.
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook

Have something to add?
Draft saved Draft deleted