[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.1 Modelling photonic crystal devices

Let us model the photonic crystal splitter from fig 2.1:

figs/splitter

This device consists of a 2D periodic arrangement of GaAs rods in air, which is impenetrable for certain wavelengths. By omitting some rods, we can create channels which guide the light. In the example of the splitter, light enters the structure from the left, is guided by the air channel in the photonic crystal, and finally split into two equal parts.

Although we can already analyse such a structure with the knowledge we have from the tutorial, there are a number of techniques that can be applied to speed up the simulation. This is illustrated in the following code, which can be found in examples/other:

 
#! /usr/bin/env python

###################################################################
#
# 90 deg 3dB splitter in rectangular lattice of rectangular 
# GaAs rods in air
#
###################################################################

from camfr import *

set_polarisation(TE)
set_lambda(1.5)
set_N(50)

# Set geometry parameters

GaAs = Material(3.4)
air  = Material(1.0)
  
a = .600     # period
r = .150/2.0 # rod radius

set_lower_wall(slab_H_wall)

cl = 0 # air cladding

periods = 3  # periods above outer waveguide
sections = 1 # intermediate 90 deg sections

# Define slabs.

no_rods = Slab(air(a-r+(sections+1+periods)*a+cl))

# Central waveguide.
 
cen = Slab(  air(a-r)                                               \
           + (sections+1+periods)*(GaAs(2*r) + air(a-2*r))          \
           + air(cl) )

# Vertical section.

ver = Slab(  air(a-r + (sections+1)*a)                              \
           + periods*(GaAs(2*r) + air(a-2*r) )                      \
           + air(cl) )

# Outer arms.
 
arm = Slab(  GaAs(r) + air(a-2*r)                                   \
           + sections*(GaAs(2*r) + air(a-2*r))                      \
           + air(a)                                                 \
           + periods*(GaAs(2*r) + air(a-2*r))                       \
           + air(cl) )

# Find lowest order waveguide mode.

wg = BlochStack(cen(2*r) + no_rods(a-2*r))
wg.calc()

print wg

guided = 0
for i in range(2*N()):
    if (abs(wg.mode(i).kz().imag) < abs(wg.mode(guided).kz().imag)):
        if wg.mode(i).kz().real > 0:
            guided = i

# Calculate splitter.

splitter = Stack(  5*(cen(2*r) + no_rods(a-2*r))                   \
                 +    ver(2*r) + no_rods(a-2*r)                    \
                 + 5*(arm(2*r) + no_rods(a-2*r)) )

splitter.set_inc_field(wg.mode(guided).fw_field())
splitter.calc()

print "R", splitter.R12(0,0)

# Calculate field.

outfile = open("splitter.out", 'w')

for x in arange(0.000, no_rods.width() - cl - a, a/20.):
    for z in arange(0.000, splitter.length(), a/20.):
        print >> outfile, abs(splitter.field(Coord(x, 0, z)).E2()),
    print >> outfile

outfile.close()    

Note in this example the use of \ to split up long lines. This is necessary because of the way Python relies on whitespace.

An important note is that CAMFR always uses the polarisation definitions as they are conventional in waveguide theory, i.e. TE polarisation corresponds here to the electric field along the rods, out of the plane of the picture. Unfortunately in photonic crystal literature this is called TM polarisation.

Now, we need to find a suitable excitation in order to calculate the field profiles in this structure. In other methods like FDTD, we would do this by placing a current source in a very long stretch of the photonic crystal waveguide in the left of fig. 2.1. After this long stretch of waveguide, an equilibrium field distribution with only the fundamental mode of the waveguide would appear, which can be used to excite the splitter.

This is rather slow, since we need a long stretch of waveguide to obtain this equilibrium field distribution. However, because of the frequency domain nature of CAMFR, we can directly excite the structure with a quasi-equilibrium field distribution. In order to do that, we first perform a sub-calculation which gives us the Bloch modes of the photonic crystal waveguide without the splitter:

 
wg = BlochStack(cen(2*r) + no_rods(a-2*r))
wg.calc()

Here, we define wg to be an infinite repetition of the sections cen and no_rods. After a call to calc, we can examine the properties of this waveguide and its Bloch modes just like any other waveguide mode (with calls to kz(), field(), ...). The only difference is that a BlochStack has 2N modes rather than N, because it contains both forward and backward Bloch modes.

(Note that if we wanted to calculate the full band diagram of this periodic structure in the direction of z, we simply have to place this calculation inside a loop over all frequencies of interest, and look at the BlochModes where the imaginary part of the propagation constant is sufficiently small.)

After we inspect the propagation factors to determine to locate the fundamental mode, we excite the splitter with the forward field of this mode:

 
splitter.set_inc_field(wg.mode(guided).fw_field())

This gives us a quasi-equilibrium field distribution almost immediately, and we can very efficiently calculate the properties of the splitter using only a small computational domain.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated by root on August, 27 2008 using texi2html 1.76.