Моделирование фотонных кристаллов в программной среде 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 - структу