Monday, February 20, 2012

Task 2: Surface Plasmon Dispersion

Dispersion curves are useful to understand transport. I set up a MEEP simulation of two surfaces of Ag separated by a 100e-9m gap. You can see 3 modes: surface plasmons, gap propagation, and bulk plasmons. ~0.7 is omega_p the plasma frequency.

(set! geometry-lattice (make lattice (size 20 no-size no-size)))
(set! pml-layers (list (make pml (thickness 1))))
(set-param! resolution 30)

(define myAg (make dielectric (epsilon 1)
(polarizations
(make polarizability
(omega 1e-20) (gamma 0.0038715) (sigma 4.4625e+39))
; (make polarizability
; (omega 0.065815) (gamma 0.31343) (sigma 7.9247))
; (make polarizability
; (omega 0.36142) (gamma 0.036456) (sigma 0.50133))
; (make polarizability
; (omega 0.66017) (gamma 0.0052426) (sigma 0.013329))
; (make polarizability
; (omega 0.73259) (gamma 0.07388) (sigma 0.82655))
; (make polarizability
; (omega 1.6365) (gamma 0.19511) (sigma 1.1133))
)))

(set! geometry (list
                (make block (center -3 0 0 0.0) (size 5 infinity infinity)
                      (material myAg ))
    (make block (center 3 0 0 0.0) (size 5 infinity infinity)
                      (material myAg ))
      ))

(set! sources (list
               (make source
                 (src (make gaussian-src (frequency 2.5) (fwidth 5)))
                 (component Ex)
                 (center 0 0 0))
    (make source
                 (src (make gaussian-src (frequency 2.5) (fwidth 5)))
                 (component Ex)
                 (center -.5 0 0))
    (make source
                 (src (make gaussian-src (frequency 2.5) (fwidth 5)))
                 (component Ex)
                 (center .5 0 0)) 
     ))

(define-param kmin 0.0)
(define-param kmax 4.0)
(define-param k-interp 50)
(define kpts (interpolate k-interp (list (vector3 0 kmin 0) (vector3 0 kmax 0))))
(define all-freqs (run-k-points 200 kpts)) ; a list of lists of frequencies  

And here's a python snippet that gives a list of k-vectors their frequencies by giving it the MEEP output as a file object
def getfreqs(meepoutfileobj):
    fd=[]
    for aline in meepoutfileobj:
        if 'freqs:' in aline:
            ld=aline.split(',')
            kpt=ld[2:5];freqs=ld[5:]
            pts=[( [float(an) for an in kpt]  ,float(afreq)) for afreq in freqs]
            fd.extend(pts)
    if fd==[]:return None
    return fd

7 comments:

  1. Hi, dear
    i used your code, but it seems a lot of frequeicies is missing by harminv, i could not get the graph correctly, can you send me a full version of your code

    ReplyDelete
  2. Majid,

    Excellent example! One question: it seems that the PML layer is not overlapping with the silver layer. In fact, there is an air layer between the PML and silver, causing unwanted modes to exist. Is there a reason why PML is not overlapping with Ag?

    ReplyDelete
  3. Thanks. it's unintended that i have a gap b/w the silver and pml. i intended /that/ gap to be zero with no overlap. i thought i checked that by substituting (epsilon somenumber) and outputting the epsilon as a function of distance. i'll check again.

    ReplyDelete
  4. i haven't checked yet but perhaps it only appears there are extra modes because of numerical artifacts. increasing the resolution might help. i remember it was much worse on a lower resolution.

    ReplyDelete
  5. Hi Majid,

    I have a question about how to define a material by pure Drude model with Lorentzian oscillating term. Let say a material epsilon(omega)= eps_inf + sigam/(omega*(omega+i*gamma)) with eps_inf=12,sigma=0.3(2*pi*c/a)²,gamma=1.6(2*pi*c/a). I am looking forward to your reply! Thanks in advance for your kindly help!

    ReplyDelete
  6. Sorry John but my priorities have shifted significantly away from this work. Did you go through the math and code of this page?

    ReplyDelete