Моделирование фотонных кристаллов в программной среде MEEP. Знакомство со средой программирования

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

того, чтобы каждый раз прописывать свойства материала при описании каждого участка структуры, можно задать характеристики материала в виде отдельной переменной:

(define eps 12)

(define mat (make dielectric (epsilon eps))) - зная синтаксис предыдущего примера, легко определить, что мы определили диэлектрик с ?=12.

4)Теперь переменную mat можно использовать при описании структур:

(set! geometry (list(make block (center 0 0) (size infinity infinity infinity) (material mat))))

make block - создаем block бесконечных размеров посреди р

(size infinity infinity infinity) (material mat)- бесконечных размеров из материала mat.

(center 0 0) - посреди расчетной области.

5)Следующим шагом опишем реализацию циклов, формирующих дырки в кристаллической структуре.

Циклы реализуют одну из схем do-loop языка Scheme.

(do ((x dmin (+ x ds))) ((> x dmax))

(do ((y dmin (+ y ds))) ((> y dmax))

)

)

dmin, dmax, ds - константы, задающие минимальное и максимальное значение счетчика цикла, ds - шаг счетчика цикла

x dmin - цикл выполняется, начиная с x=dmin(dmin=-5)

(+ x ds) - с шагом ds(ds=1)

(> x dmax) - пока x не станет больше dmax (dmax=5).

Аналогично и для координаты y. В итоге мы описали структуру из дырок размером 11*11, с шагом ds=1.

6)Следующий оператор описывает расположение дефекта в кристалле

(if (and (not (eqv? x l_place)) (not (eqv? y l_place)))

(set! geometry (append geometry(list

(make cylinder (center x y) (material air) (radius r) (height infinity))

)))

)

Математические операции в Scheme описываются несколько непривычным способом: вначале идет знак операции, а затем только числа.

Например, (2+3-1) можно представить как (+ 2 3 -1). - здесь используется не как математическая операция, а как знак числа. Аналогичным образом формируются и более сложнее выражения.

(not (eqv? x l_place)) - eqv? Одна из нескольких операций сравнения. Eqv? Сравнивает два числа между собой и возвращает true если они равны друг другу. Not - меняет результат логической операции на противоположный.

Благодаря структурам (5) и (6) происходит построение дырок внутри кристалла. При вычислении новых значений X и Y, происходит их сравнение с l_place(в нашем случае l_place=1). Дырка в кристалле делается только тогда, когда X или Y не равны l_place. Тем самым формируется дефект в виде креста.

Процесс компиляции и представления результата, аналогичен предыдущей программе.

 

4.4 Пример программы , анализирующей структуру кристалла

 

В основу следующей программы положена программа, рассмотренная в предыдущем примере. В ней также формируется кристалл с е=12 и дефект в виде креста. Цель программы: рассчитать количество прошедшей сквозь дефект энергии по сравнению с вошедшей в него.

;flux1

;1

(define fcen 0.4) ;цент частот в пакете волн

(define df 0.1) ;ширина частот

;если no-bend=true, то не рисуем кристаллическую структуру

(define-param no-bend? false)

(define lx 20) ;Задаем размер расченой области

(define ly 20)

(define r 0.25) ;радиус отверстий

(define eps 12) ;материал

(define-param dmin -5) ;Задаем параметры цикла

(define-param dmax 5)

(define-param ds 1) ; величина шага

(define-param dpml 1) ;величина области PML;

(define-param l_place (+ (/ (+ dmin dmax) 2) 1)) ;задаем координаты линий

(define mat (make dielectric (epsilon eps))) ;создаем диэлектрик mat с e=12

;----------------------------------------------------------------------------

(set! geometry-lattice (make lattice (size lx ly no-size))) ;Задаем размеры расчетной области

(set! geometry (list(make block (center 0 0) (size infinity infinity infinity) (material mat))))

;2

; Заполняем расчетную область диэлектриком mat

(if (not no-bend?)

;Цикл по созданию отверстий в диэлектрике(материал - воздух)

(do ((x dmin (+ x ds))) ((> x dmax))

(do ((y dmin (+ y ds))) ((> y dmax))

(if (and (not (eqv? x l_place)) (not (eqv? y l_place))

(set! geometry (append geometry(list

(make cylinder (center x y) (material air) (radius r) (height infinity))

)))))))

(set! pml-layers (list (make pml (thickness dpml))))

(set! resolution 10)

;3

(set! sources (list(make source(src (make gaussian-src (frequency fcen) (fwidth df)))

(component Ez)(center -9 0)(size 0 3))))

;4

(define-param nfreq 100) ; количество частот в диапазон[fcen-df/2; fcen+df/2]

(define trans ; количество прошедшего потока

(add-flux fcen df nfreq

(if no-bend?

(make flux-region

(center (- dmin 2) l_place) (size 0 (* 2 ds)))

(make flux-region

(center (+ dmax 2) l_place) (size 0 (* 2 ds))))))

;5

(run-sources+

(stop-when-fields-decayed 50 Ez

(if no-bend?

(vector3 (- dmin 2) l_place)

(vector3 (+ dmax 2) l_place))

e-3))

;6

(display-fluxes trans)

1)Нам понадобится ввести в расчетную область волновой пакет, для того чтобы рассчитать количество перенесенной энергии сквозь кристалл. Сначала нужно посчитать количество энергии, попадающей в расчетную зону без кристаллической структуры. Это нужно, чтобы не брать в расчет эффекты отражения от кристалла. Только потом можно вводить в расчетную область кристалл и пропускать через него волновой пакет.

Для этих целей используется параметр no-bend.

No-bend=true - располагаем в расчетной области только источник излучения и проводим первый расчет

No-bend=false - заново располагаем в расчетной области источник излучения и кристалл. Производим второй расчет.

Значение no-bend=false - задается в программе по умолчанию

2)(if (not no-bend?) ; ) - Здесь и далее идет проверка параметра No-bend. Как видно из структуры, запуск программы нужно произвести два раза. Первый раз с no-bend=true, а второй раз с no-bend=false.

3)(set! sources

(list

(make source(src

(make gaussian-src (frequency fcen) (fwidth df)))

(component Ez)

(center -9 0)(size 0 3))))

(make gaussian-src - задаем гаусиановый импульсный источник

(frequency fcen) - с основной частотой fcen

(fwidth df) - и шириной импульса df

4)В этой части программы задается в какой области пространства нужно производить расчеты.

(define trans ; количество прошедшего потока

(add-flux fcen df nfreq

(if no-bend?

(make flux-region

(center (- dmin 2) l_place) (size 0 (* 2 ds)))

(make flux-region

(center (+ dmax 2) l_place) (size 0 (* 2 ds))))))

(define trans - структу