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

4.1 Первая программа

фотонный кристалл операционный программа

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

Пример 1(Листинг программы test2.ctl):

;1)

(set! geometry-lattice (make lattice (size 10 8 no-size)))

;2)

(set! geometry (list

(make block (center 0 0) (size 1.5 1.5 infinity) (material (make dielectric (epsilon 12))) )

(make block (center -1.5 0) (size 1 1 infinity) (material (make dielectric (epsilon 12))) )

(make block (center 1.5 0) (size 1 1 infinity) (material (make dielectric (epsilon 12))) )

(make block (center 0 -1.5) (size 1 1 infinity) (material (make dielectric (epsilon 12)) )

(make block (center -1.5 -1.5) (size 1 1 infinity) (material (make dielectric (epsilon 12))) )

(make block (center 1.5 -1.5) (size 1 1 infinity) (material (make dielectric (epsilon 12))) )

(make block (center 0 1.5) (size 1 1 infinity) (material (make dielectric (epsilon 12))) )

(make block (center -1.5 1.5) (size 1 1 infinity) (material (make dielectric (epsilon 12))) )

(make block (center 1.5 1.5) (size 1 1 infinity) (material (make dielectric (epsilon 12)))) )

)

;3)

(set! sources (list (make source (src (make continuous-src (wavelength 1.5) (width 20))) (component Ez) (center -4 0)(size 0 2.5))))

;4)

(set! pml-layers (list (make pml (thickness 1.0))));5)

(set! resolution 20)

;6)

(run-until 200 (at-beginning output-epsilon) (to-appended "ez" (at-every 0.6 output-efield-z)))

Начнем описание программы команда за командой

1) Прежде чем объявить структуру кристалла, расположение и частоту источника и др. параметры, необходимо задать размеры расчетной области:

(set! geometry-lattice (make lattice (size 10 8 no-size)))

· geometry-lattice - задает область в которой будут проводиться расчеты

· size 10 8 no-size - задаем размеры расчетной области. Общий формат команды size x y z, где x y z - размер в каждой из 3-х координат соответственно. С помощью этой команды мы задали двухмерную область размером 10х8. Эта команда позволяет задавать трехмерные области, но в нашем случае размер вдоль оси Z не указан. Т.к мы не задали свойства расчетной области, то по умолчанию,е=1.

2) Теперь можно разместить внутри какие-нибудь объекты. Следующая структура:

(set! geometry (list

(make block (center 0 0) (size 1.5 1.5 infinity) (material (make dielectric (epsilon 12))) )

(make block (center -1.5 0) (size 1 1 infinity) (material (make dielectric (epsilon 12))) )

---------------

)

описывает массив элементов. Распишем ее более подробно:

· (set! geometry … )- задает объекты, которые будут участвовать в симуляции.

· (list … ) - создает список элементов, которые будут участвовать в симуляции. Используется с целью создания массивов и других форм объединения структур между собой. Например в If для разделения результатов true и else. Используется практически во всех командах. В нашем случае list объединяет несколько блоков в единый массив блоков.

· make block - задает блок(квадрат, прямоугольник - 2-у мерный случай; прямоугольный параллелепипед - 3-х мерный). Кроме этого поддерживаются следующие геометрические фигуры:

· sphere radius [number] - сфера;

· cylinder radius [number] height [number] axis [vector3] - цилиндр

· cone radius2 [number] - конус

· ellipsoid - элипс

· Рассмотрим параметры make block более подробно:

· (center 0 0) - указываем где будет располагаться центр блока(в нашем случае в начале координат). По умолчанию координате Z присваивается значение 0.

· (size 1.5 1.5 infinity) - задает размеры блока. В нашем случае описывается стержень с основанием 1.5*1.5 и бесконечной длинной.

· (material (make dielectric (epsilon 12))) - задает свойства материала. В нашем случае: Задаем диэлектрик с е=12.

· C помощью описанной выше команды, создается структура из 9 стержней, отстоящих друг от друга на расстоянии а=1.5. Все стержни, кроме центрального, имеют основание размером 1*1. Центральный имеет размер 1.5*1.5. Каждый из стержней имеет диэлектрическую проницаемость е1=12. Диэлектрическая проницаемость окружающей среды е2=1.

3) Теперь опишем параметры источника:

(set! sources (list (make source (src (make continuous-src (wavelength 1.5) (width 20))) (component Ez) (center -4 0)(size 0 2.5))))

· (set! sources … )- команда задающая вид излучения, размеры и его частоту, а также положение в пространстве.

· (make source (src … ) - создать отдельный источник. Meep поддерживает 3 вида источников:

· continuous-src - синусоида

· gaussian-src - гаусиановый импульсный источник пропорциональный ехр (- iщt - (Т - Т0) 2 / 2W2).

· custom-src - заданная пользователем функция

В нашем случае, задается синусоидальная функция с длинной волны л=1.5. Поле может быть описано также с помощью частоты (frequency х) и периода (period x)Параметр (width 20) указывает на то, что функция будет введена в моделируемую область не сразу, а постепенно в течении 20-ти временных интервалов.

· (component Ez) - источник поля является компонентой Jz.

· (center -4 0)(size 0 2.5) - задает координаты центра и размер источника излучения. В нашем случае, источник вытянут вдоль оси Y на 2.5 и не имеет размера в X и Z направлениях

4) Опишем толщину PML слоя. Известно, что при расчетах волна может пройти сквозь слой PML отразиться от границы расчетов и вернуться обратно в расчетную область. Чтобы этого избежать рекомендуется задавать толщину слой PML порядка 10% от размера расчетной области. Также следует помнить, что PML находится внутри расчетной области.

(set! pml-layers (list (make pml (thickness 1.0)))) - толщина PML=1.

5) (set! resolution 20) - Следующая команда задает количество пикселей на единицу длинны. Получаем, что размер расчетной области равен 200х160 pixels.

6) Программа готова, теперь ее нужно запустить:

(run-until 200 (at-beginning output-epsilon) (to-appended "ez" (at-every 0.6 output-efield-z)))

· (run-until 200 - запуск расчетов(на 200 временных интервалов).

· (at-beginning output-epsilon)(to-appended "ez" (at-every 0.6 output-efield-z))) - С помощью этих команд указывается какие компоненты поля нам нужно вывести. В теле программы можно проводить любые вычисления, а результат выводить с помощью этих команд. В нашем случае выводится две компоненты поле - это е и Ez.

(at-every 0.6 - значение компоненты Ez выводится каждые 0.6 временных интервала. Это впоследствии пригодится для создания GIF анимации.

(to-appended "ez" - причем выходной файл будет иметь приставку ez в названии.